C#基础温习: 理解委托和事件
作者:网络转载 发布时间:[ 2016/6/2 11:20:30 ] 推荐标签:测试开发技术 .NET
1. 委托
委托类似于C++中的函数指针(一个指向内存位置的指针)。委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针。简单理解,委托是一种可以把函数当做参数传递的类型。很多情况下,某个函数需要动态地去调用某一类函数,这时候我们在参数列表放一个委托当做函数的占位符。在某些场景下,使用委托来调用方法能达到减少代码量,实现某种功能的用途。
1.1 自定义委托
声明和执行一个自定义委托,大致可以通过如下步骤完成:
利用关键字delegate声明一个委托类型,它必须具有和你想要传递的方法具有相同的参数和返回值类型;
创建委托对象,并且将你想要传递的方法作为参数传递给委托对象;
通过上面创建的委托对象来实现该委托绑定方法的调用。
下面一段代码,完成了一次应用委托的演示:
C#
//step01:使用delegate关键字声明委托
public delegate int CalcSumDelegate(int a, int b);class Program
{
static void Main(string[] args)
{
//step03:实例化这个委托,并引用方法
CalcSumDelegate del = new CalcSumDelegate(CalcSum);
//step04:调用委托
int result = del(5, 5);
Console.WriteLine("5+5=" + result);
}//step02:声明一个方法和委托类型对应
public static int CalcSum(int a, int b)
{
return a + b;
}
}
通过上面4个步骤,完成了委托从声明到调用的过程。接着,咱也学着大神用ILSpy反编译上面的代码生成的程序集。截图如下:
(1)自定义委托继承关系是:System.MulticastDelegate —> System.Delegate —>System.Object。
(2)委托类型自动生成3个方法:BeginInvoke、EndInvoke、Invoke。查资料得知,委托正是通过这3个方法在内部实现调用的。
Invoke 方法,允许委托同步调用。上面调用委托的代码del(5, 5)执行时,编译器会自动调用 del.Invoke(5,5);
BeginInvoke 方法,以允许委托的异步调用。假如上述委托以异步的方式执行,则要显示调用dal.BeginInvoke(5,5)。
注意:BeginInvoke 和 EndInvoke 是.Net中使用异步方式调用同步方法的两个重要方法,具体用法详见微软官方示例。
1.2 多播委托
一个委托可以引用多个方法,包含多个方法的委托叫多播委托。下面通过一个示例来了解什么是多播委托:
C#
//step01:声明委托类型
publicdelegatevoidPrintDelegate();
publicclassProgram
{
publicstaticvoidMain(string[]args)
{
//step03:实例化委托,并绑定第1个方法
PrintDelegatedel=Func1;
//绑定第2个方法
del+=Func2;
//绑定第3个方法
del+=Func3;
//step04:调用委托
del();//控制台输出结果:
//调用第1个方法!
//调用第2个方法!
//调用第3个方法!
}
//step02:声明和委托对应签名的3个方法
publicstaticvoidFunc1()
{
Console.WriteLine("调用第1个方法!");
}
publicstaticvoidFunc2()
{
Console.WriteLine("调用第2个方法!");
}
publicstaticvoidFunc3()
{
Console.WriteLine("调用第3个方法!");
}
}
可以看出,多播委托的声明过程是和自定义委托一样的,可以理解为,多播委托是自定义委托在实例化时通过 “+=” 符号多绑定了两个方法。
(1)为什么能给委托绑定多个方法呢?
自定义委托的基类是多播委托MulticastDelegate ,这要看看微软是如何对System.MulticastDelegate定义的:
MulticastDelegate 拥有一个带有链接的委托列表,该列表称为调用列表,它包含一个或多个元素。在调用多路广播委托时,将按照调用列表中的委托出现的顺序来同步调用这些委托。如果在该列表的执行过程中发生错误,则会引发异常。(摘自MSDN)
(2)为什么使用“+=”号能实现绑定呢?
先来看上述程序集反编译后的调用委托的代码:
“+=”的本质是调用了Delegate.Combine方法,该方法将两个委托连接在一起,并返回合并后的委托对象。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11