C#中委托、事件和回调函数的理解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#中委托、事件和回调函数的理解
在C#中我们经常会碰到事件,尤其是在WPF 或者WinForm 中,窗体加载、或者点击⼀个按钮,都会触发事件。
实际上,事件是对委托的封装。
如果不进⾏封装,让委托暴露给调⽤者,调⽤者就可以把委托变量重新引⽤到新的委托对象,也就删除了当前要调⽤的⽅法列表;更糟糕的是,公共的委托成员打破了封装不仅导致代码难以维护和调试,⽽且会导致应⽤程序有安全风险。
下⾯分别说明。
1、委托
委托可以理解为⼀种协议。
委托,是什么意思呢?举个例⼦,你碰到⼀件事,你需要让别⼈来帮你做(可能你还有别的事情要做),这就是委托,把你现在不能做的事让别⼈去做。
为什么说委托就像⼀个协议呢,因为你不想把事情搞砸了,所以你“委托”的这个⼈做的这件事,你需要给他定⼀个标准。
在C#中就是给所委托的对象定义好签名,参数有⼏个,分别是什么
类型,委托⽅法需要反馈给你什么东西(或者不反馈)。
从这种意义上理解,委托就像是⼀种协议。
下⾯是例⼦。
} class Helper {
public Helper() {}
public int Add(int num1, int num2) { return num1 + num2; } }
上述例⼦中public delegate int MyDelegate(int x, int y);声明了⼀个委托,告诉被委托者这件事你要这么⼲,我给你两个整数,你计算他们的和,怎么计算我不管,计算完之后你把和给我。
2、事件在某件事情发⽣时,⼀个对象可以通过事件通知另⼀个对象。
⽐如,前台界⾯⼀个求和按钮被点击了,他通知你,可以把a 和b 这两个数相加了。
这就是⼀个事件。
可以看出事件是在⼀个时间节点去触发另外⼀件事情,⽽另外⼀件事情怎么去做,他不会关⼼。
就事件来说,关键点就是什么时候,让谁去做。
在编译器处理event 关键字时,会⾃动提供注册和注销⽅法以及任何必要的委托类型成员变量(私有的),因此不能从触发事件的对象去调⽤它们,event 关键字就像⼀个语法糖,节省了我们打字的时间。
定义⼀个事件有两步,⾸先定义⼀个委托,它包括了这件事的“协议”和委托⽅法(由谁去做);其次,⽤event 关键字和相关委托声明这个事件。
事件像是⼀个接⼝,封装了委托所定的“协议”。
由于委托已经定义了协议,剩下的就是按这个协议去办
事,⾄于怎么做它并不关⼼。
下⾯是⼀个例⼦。
Console.WriteLine(sum);
} } class Helper { public Helper() {}
从上⾯可以看出,调⽤者⽆法访问委托对象。
3、回调函数
回调函数就是把⼀个⽅法的传给另外⼀个⽅法去执⾏。
回调函数只是⼀个功能⽚段,由⽤户按照回调函数的调⽤约定来实现的⼀个函数。
先看⼀个例⼦。
}
private static int MyAdd(int a, int b, MyDelegate myDele) { return myDele(a, b);
可以看出,可以把任意⼀个符合这个委托的⽅法传递进去,意思就是说这部分代码是可变的。
⽽设计上有⼀个抽离出可变部分代码的原则,这种⽤法⽆疑可以⽤到那种场合了。
以上是个⼈理解,如果有不合理的地⽅欢迎交流。