📜  委托 (1)

📅  最后修改于: 2023-12-03 15:09:20.133000             🧑  作者: Mango

委托介绍

什么是委托?

在C#中,委托是一种类型,它允许将方法作为参数传递,以及将方法作为返回值返回。委托在事件处理和回调方法方面非常有用。

委托的声明

使用delegate关键字可以声明一个委托类型。例如:

public delegate void MyDelegate(int arg1, string arg2);

以上定义了一个名为MyDelegate的委托类型,它接收一个int类型的参数和一个string类型的参数,并且没有返回值。当我们想要委托调用一个方法时,该方法必须与委托具有相同的参数列表和返回值类型。

委托的使用

假设我们有一个需要执行许多相似但不完全相同的方法的类。在这种情况下,我们可以使用委托将每个方法委托给一个共同的方法。例如:

public class MyClass
{
    public void DoSomething(int input, MyDelegate theDelegate)
    {
        theDelegate(input, "Hello, World!");
    }
}

public class Program
{
    static void Main(string[] args)
    {
        MyClass myObject = new MyClass();

        MyDelegate delegate1 = new MyDelegate(Method1);
        MyDelegate delegate2 = new MyDelegate(Method2);

        myObject.DoSomething(123, delegate1);
        myObject.DoSomething(456, delegate2);
    }

    static void Method1(int arg1, string arg2)
    {
        Console.WriteLine("Method1 called with {0} and {1}", arg1, arg2);
    }

    static void Method2(int arg1, string arg2)
    {
        Console.WriteLine("Method2 called with {0} and {1}", arg1, arg2);
    }
}

在上面的代码中,MyClass具有一个DoSomething方法,它接收一个int类型的参数和一个MyDelegate类型的参数。在Main方法中,我们声明了两个不同的委托类型,分别调用了Method1Method2方法。每个委托都是通过DoSomething方法传递给MyClass的。

运行上面的程序将打印:

Method1 called with 123 and Hello, World!
Method2 called with 456 and Hello, World!
匿名委托

可以使用匿名方法创建匿名委托。例如:

MyDelegate delegate3 = delegate (int arg1, string arg2) {
    Console.WriteLine("Anonymous method called with {0} and {1}", arg1, arg2);
};

在上面的代码中,我们创建了一个没有名称的委托。该委托接收一个int类型的参数和一个string类型的参数,并且没有返回值。这个委托是通过使用关键字delegate和参数列表表示为匿名方法来创建的。

Lambda表达式

另一种创建委托的方法是使用Lambda表达式。Lambda表达式是一种匿名函数,用于将方法作为参数传递。例如:

MyDelegate delegate4 = (arg1, arg2) => Console.WriteLine("Lambda expression called with {0} and {1}", arg1, arg2);

在上面的代码中,我们使用Lambda表达式创建了一个和上一个匿名委托一样的委托。

总结

委托是一种非常有用的类型。它可以让我们轻松地将方法作为参数传递和返回。匿名委托和Lambda表达式使委托更加方便。