上一篇: C# 索引器(Indexer)

下一篇: C# 事件(Event)

C# 委托(Delegate)

在本教程中,我们将学习C#委托(Delegate)的基本概念及其应用。

  1. 委托简介
  2. 定义和使用委托
  3. 多播委托
  4. 泛型委托
  5. 事件和委托

委托简介

委托(Delegate)是C#中表示方法引用的类型。它们类似于C++中的函数指针或其他编程语言中的回调函数。委托可以用于将方法作为参数传递给其他方法,实现事件处理、异步操作等功能。

定义和使用委托

要定义委托,需要使用 delegate关键字并指定方法签名。以下代码演示了如何定义一个委托类型 MyDelegate,该类型表示一个接受整数参数并返回整数结果的方法。

                public delegate int MyDelegate(int x);
                

现在可以创建一个匹配该签名的方法,并使用委托类型实例化一个委托对象。

                public class MyClass
                {
                    public int Double(int x)
                    {
                        return x * 2;
                    }

                    public void UseDelegate()
                    {
                        MyDelegate myDelegate = new MyDelegate(Double);
                        int result = myDelegate(10);
                        Console.WriteLine(result); // 输出 "20"
                    }
                }
                

也可以使用匿名方法或Lambda表达式创建委托实例:

                MyDelegate myDelegate = x => x * 2;
                

多播委托

多播委托是一种特殊类型的委托,它可以引用多个方法。当调用多播委托时,将依次执行所有关联的方法。

要创建多播委托,请使用 +=运算符将多个方法引用添加到委托实例中。

                public class MyClass
                {
                    public void Method1()
                    {
                        Console.WriteLine("Method1 called.");
                    }

                    public void Method2()
                    {
                        Console.WriteLine("Method2 called.");
                    }

                    public void UseMulticastDelegate()
                    {
                        Action myDelegate = Method1;
                        myDelegate += Method2;

                        myDelegate(); // 输出 "Method1 called." 和 "Method2 called."
                    }
                }
                

泛型委托

泛型委托允许在定义委托类型时使用类型参数。这增加了委托的灵活性,可以在不同类型之间共享通用功能。

C# 提供了几种预定义的泛型委托类型,如 FuncActionPredicate。例如,以下代码演示了如何使用 Func 类型实例化一个委托以及使用 Action<int> 类型输出值。

                public int MultiplyByThree(int x)
                {
                    return x * 3;
                }

                public void DisplayValue(int value)
                {
                    Console.WriteLine($"Value: {value}");
                }

                public void UseGenericDelegate()
                {
                    Func<int, int> myFunc = MultiplyByThree;
                    Action<int> myAction = DisplayValue;

                    int result = myFunc(10);
                    myAction(result); // 输出 "Value: 30"
                }
                

事件和委托

委托常用于处理事件。定义事件时,需要声明一个委托类型,并使用 event 关键字创建一个事件实例。

以下代码演示了如何定义一个简单的事件模型:

                // 定义自定义事件参数类
                public class MyEventArgs : EventArgs
                {
                    public string Message { get; set; }

                    public MyEventArgs(string message)
                    {
                        Message = message;
                    }
                }

                // 定义事件处理程序委托
                public delegate void MyEventHandler(object sender, MyEventArgs e);

                public class MyClass
                {
                    // 定义事件
                    public event MyEventHandler MyEvent;

                    // 触发事件的方法
                    public void TriggerEvent()
                    {
                    if (MyEvent != null)
                    {
                        MyEventArgs args = new MyEventArgs("The event has been triggered.");
                        MyEvent(this, args);
                    }
                    }
                }

                public class Program
                {
                public static void Main(string[] args)
                {
                    MyClass myObject = new MyClass();
                    // 订阅事件
                    myObject.MyEvent += MyEventHandlerMethod;

                    // 触发事件
                    myObject.TriggerEvent();
                }

                // 事件处理程序方法
                private static void MyEventHandlerMethod(object sender, MyEventArgs e)
                {
                    Console.WriteLine(e.Message); // 输出 "The event has been triggered."
                }
                

本教程简要介绍了C#委托的基本概念及其应用。通过学习和实践,您将更好地理解并掌握C#委托的使用方法。委托是C#编程中的一种强大工具,可以帮助您创建灵活且可扩展的代码。