委托与事件(浅度分析)—事件
发布日期:2021-06-29 11:15:35
浏览次数:2
分类:技术文章
本文共 1687 字,大约阅读时间需要 5 分钟。
事件的由来
什么是事件?事件其实就是对委托的封装。什么意思呢?比如声明字段的时候,每个字段都有属性。那么委托和事件的关系其实就和字段和属性的关系是一样的,为了更好的封装委托,事件就应运而生了。
接下来就分析一下事件是怎么来的,将委托声明在类的内部。
//委托声明在类的内部public class GreetingManager{ public GreetingDelegate delegate1; public void GreetPeople(string name) { if(delegate1 != null) { delegate1(name); } }}//客户端static void Main(string[] args){ GreetingManager gm = new GreetingManager(); gm.delegate1 = EnglishGreeting; gm.delegate1 += ChineseGreeting; //gm.GreetPeople("Vijay"); gm.delegate1("Vijay");}
不知大家有没有发现上面的问题:第1点,如果将类中的委托声明为 public ,本来客户端需要通过 GreetingManager 中的 GreetPeople 方法来调用委托,而客户端却也可以直接调用委托,非常不安全。而如果想有更好的封装性,声明为 private 的话,客户端就无法将方法绑定到委托;第2点,在客户端为委托绑定方法的时候,第一次用的是“=”,第二次用的是“+=”,这种非一致性会提高操作的失误性。
显然,这样是不行的。那有没有好的解决办法呢?利用事件,就可以实现对委托的封装。
public class GreetingManager{ public GreetingDelegate delegate1; public event GreetingDelegate MakeGreet; public void GreetPeople(string name) { MakeGreet(name); }}//客户端static void Main(string[] args){ GreetingManager gm = new GreetingManager(); //gm.MakeGreet = EnglishGreeting; //会报错,IDE不允许这样写 gm.MakeGreet += ChineseGreeting; gm.GreetPeople("Vijay"); //gm.delegate1("Vijay"); //也会报错,客户端无法直接调用委托了}
看上面的代码,会发现事件都做了什么。事件解决了第一块代码的问题:绑定委托的非一致性问题,客户端可以直接调用委托的问题。 事件封装了委托,而且客户端只能通过事件为委托绑定方法。这是不是很类似于属性呢?属性也是封装了字段,但只能通过属性为字段赋值。
事件是什么
为什么增加了事件,就可以解决问题呢?接下来看一下将委托编译之后的代码是什么样的。
public GreetingDelegate delegate1;public event GreetingDelegate MakeGreet;
可以发现即使将委托声明为 Public ,编译后的代码 事件会自动将 委托变为 private 的,但是增加绑定委托和接触委托的方法,它们是 public 的。 通过代码,可以说 事件就是一种特殊的委托 ,类型是 private 的。
小结
什么是事件?事件就是对委托的一种封装。 如果大家看完之后,还是不明白委托和事件,推荐大家去看一下《.NET 之美》这本书,这本书中有详细的讲解委托和事件。
转载地址:https://blog.csdn.net/zwj_jyzl/article/details/81738823 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月11日 02时45分31秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
我用自己创造的深度学习框架进入腾讯,爽!
2019-04-29
芯片为什么持续缺货?
2019-04-29
又涨了?2021 年 3 月程序员工资统计新出炉
2019-04-29
初入行的C++程序员,如何快速摆脱CRUD阶段?
2019-04-29
研究生跟了一个很棒的导师是种怎样的体验?
2019-04-29
学会扶墙的机器人:没有什么能让我倒下!
2019-04-29
美国无人机在火星首飞成功,创造历史,3米飞行高度悬停30秒
2019-04-29
单片机的几种数字滤波算法
2019-04-29
用单片机控制导弹?
2019-04-29
各种滤波器合集!
2019-04-29
国产CPU深度研究报告(干货,110页)
2019-04-29
在电路中,耦合是什么?有哪些方式?
2019-04-29
变局之际,聊聊物联网的过去、现在和未来
2019-04-29
缺货涨价很久的MCU的国产和国外厂家汇总!(80家)
2019-04-29
单片机6年想转嵌入式Linux ,不知如何下手?
2019-04-29
拆解 | 某平台19元的儿童电话手表,究竟怎么做到的?
2019-04-29
五一好礼70份免费送:示波器、开发板、焊台等!
2019-04-29
2纳米芯片问世!芯片性能要起飞?!
2019-04-29
ARM Cortex系列那么多处理器,该怎么区分?
2019-04-29
知乎:学计算机的女生都怎么样了?
2019-04-29