C#:委托(Delegate)
- 委托类似于函数的指针。
- 函数的声明需要和委托的声明一致。
- 委托可作为参数传递至函数。
- 委托的多播即一次调用多个函数。
C#中的委托类似于C或C++中函数的指针。委托是储存对某个方法的引用,其是一种引用类型变量。也可用于将方法作为参数传递给其他函数。
一、声明委托
委托声明决定了可由该委托引用的方法。换言之,委托只能实例化具有兼容签名和返回类型的函数。
假设这里有一个这样的委托。
public delegate int MyDelegate (int num1, int num2);
其表示可以指向一个返回值是int
类型,参数有两个int
类型的函数。注意,这里需要引用的函数的声明必须和委托的声明一致,变量名可不一致,但一般不那么做。
二、实例化委托
还是使用上面的例子。我们这里现在有一个相加的函数。
public static int AddMethod(int num1, int num2) // 这里static是为了方便在主函数中调用
{
return num1 + num2;
}
现在我们在主函数中实例化我们的委托,并且调用。
static void Main(string[] args)
{
MyDelegate myDelegate = new MyDelegate(AddMethod); // 将函数名作为参数传入即可
// MyDelegate myDelegate = AddMethod; // 第二种实例化的方法
Console.WriteLine(myDelegate(10, 20));
// 控制台输出:
// 30
}
这里有两种实例化委托的方法,第一种只要将把需要引用的方法名作为参数名传入即可。还有另一种方法,即直接将函数名作为右值。
三、将委托作为函数参数传递
委托其本质为引用类型变量,故可将其作为函数的参数传入。这还还是沿用前文所举的例子,首先实例化委托,并将其指向两数相加的函数。之后将此委托传入两数相乘的函数。
static void Main(string[] args)
{
MyDelegate md = AddMethod; // 实例化前文的两数相加函数
Console.WriteLine(MulMethod(10, md)); // 将委托传递至乘法函数
// 控制台输出:
// 20
}
// 两数相乘的函数,注意此处参数列表
public static int MulMethod(int num1, MyDelegate handle)
{
return num1 * handle(1, 1); // 计算 num1 * (1 + 1)
}
需要注意的是乘法函数中参数的声明,这里由于在前文创建的是MyDelegate
委托,故此处也应是MeDelegate handle
。
四、委托的多播
如果希望一次委托调用多个函数该如何处理?只需要使用运算符“+”来将多个委托合并。同样的,使用运算符“-”可以移除合并的委托。
这里我们举一个例子,一个函数用来将全局函数num
打印至控制台,一个函数用来修改num
的值。此处例子与前文的例子没有关系,可单独观看。
public delegate void MyDelegate();
public static int num = 10;
public static void WriteToConsole() // 输出至控制台
{
Console.WriteLine(num);
}
public static void AddNum() // 修改num的值
{
num += 100;
}
static void Main(string[] args)
{
MyDelegate md1 = new MyDelegate(WriteToConsole); // 先创建两个委托
MyDelegate md2 = new MyDelegate(AddNum);
md1 += md2; // 将两个委托相加
md1();
Console.WriteLine("现在的num的值为:{0}", num);
// 控制台输出:
// 10
// 现在的num的值为:110
}
在创建组播的时候,首先创建多个委托,然后再将多个委托相加即可。注意这里两个函数是有先后顺序的。
可能还有更新,大概?