“ 在C#中,委托与事件是不容易弄清楚的两个概念。本文主要介绍这两个概念以及它们的用法。”
一、委托
首先,我们来看委托。委托本质上是函数或方法的指针,也就是说,委托对象的值就是指向一个方法的指针。因此,对于一个委托类型,可以创建它的实例,并使这个实例指向一个具体的方法。而这个方法的签名(即方法的参数个数、每个参数的类型以及方法的返回值)必须要与委托类型的定义一致。无论方法具体完成什么功能,只要其签名与委托定义一致即可。在C#中,定义委托使用delegate关键字。来看一个例子,以下是在C#中定义的一个委托类型:
public delegate int Calc(int a, int b);
它包括两个整型参数,其返回值也是整型。这个委托类型的实例可以指向与此签名相同的方法。比如,有以下四个方法,分别是对两个整数进行加、减、乘、除的运算:
public class DelegateTest {
public int Add(int a, int b) {
Console.WriteLine($"{nameof(Add)}:{a}+{b}={a + b}");
return a + b;
}
public int Subtract(int a, int b) {
Console.WriteLine($"{nameof(Subtract)} : {a}-{b}={a - b}");
return a - b;
}
public int Multiply(int a, int b) {
Console.WriteLine($"{nameof(Multiply)}:{a}*{b}={a * b}");
return a * b;
}
public int Divide(int a, int b){
Console.WriteLine($"{nameof(Divide)}:{a}/{b}={a / b}");
return a / b;
}
}
那么,就可以定义四个Calc委托实例,分别指向每个不同的方法。
static void Main(string[] args) {
DelegateTest delegateTest = new DelegateTest();
// 定义四个Calc委托实例
Calc calcAdd = new Calc(delegateTest.Add);
Calc calcSubtract = new Calc(delegateTest.Subtract);
Calc calcMultiply = new Calc(delegateTest.Multiply);