博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
委托与事件(浅度分析)—事件
阅读量:1871 次
发布时间:2019-04-26

本文共 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 之美》这本书,这本书中有详细的讲解委托和事件。

你可能感兴趣的文章
猿来绘Java-41-源码分析String对象的数组的排序(JDK1.8)
查看>>
猿来绘Java-42-枚举类的使用
查看>>
猿来绘Java-43-初步认识注解
查看>>
猿来绘Java-44-自定义注解和元注解
查看>>
猿来绘Java-45-JDK8新特性可重复注解和类型注解
查看>>
猿来绘Java-46-Collection接口及其方法
查看>>
猿来绘Java-47- foreatch 增强for循环
查看>>
2021/4/27课堂总结和作业
查看>>
2021.4.28课堂总结和作业
查看>>
2021.4.29课堂总结
查看>>
2021.4.30课堂总结和作业
查看>>
需要吗?2000GB+学习视频教程 面试资料免费下载
查看>>
MySQL对已存在数据库表添加自增ID字段
查看>>
磁盘爆满,服务异常同时MySQL报“Table ** is marked as crashed and should be repaired”问题解决
查看>>
idea中的一些常用快捷键
查看>>
js校验表单后提交表单的三种方法总结【转载】
查看>>
欢迎使用CSDN-markdown编辑器
查看>>
a标签中href调用js的几种方法
查看>>
jstl标签详解
查看>>
Eclipse中使用SVN的使用
查看>>