📅  最后修改于: 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
方法中,我们声明了两个不同的委托类型,分别调用了Method1
和Method2
方法。每个委托都是通过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表达式是一种匿名函数,用于将方法作为参数传递。例如:
MyDelegate delegate4 = (arg1, arg2) => Console.WriteLine("Lambda expression called with {0} and {1}", arg1, arg2);
在上面的代码中,我们使用Lambda表达式创建了一个和上一个匿名委托一样的委托。
委托是一种非常有用的类型。它可以让我们轻松地将方法作为参数传递和返回。匿名委托和Lambda表达式使委托更加方便。