委托和事件的原理

什么叫做委托?

委托就是一个类,一个密封类,一个类型。

       我们正常声明的一个委托通过反编译IL看到的是一个密封类,在Program里面生成一个类中类,这个类的构造函数可以接收一个方法,里面还有有一些别的方法,Invoke方法之类的。

那么委托有什么用呢?

逻辑解耦,代码重用,倒置

Action和Func泛型委托:

Action:没有返回值的泛型委托

Func:带返回值的委托,最后一个泛型参数类型就是就是返回值类型。

Action和Func的由来:

       我们定义了两个都没有返回值没有参数的委托,这两个委托能接收的方法签名可以是同一个,但是却不能互相转换(替换)。因为每个委托都是一个类型,这两个委托是不同的类型所以不能转换。所以这个时候微软在.Net Framework 3.0的时候推出了统一标准的Action和Func,建议开发人员都使用两个泛型委托,从而避免明明可以做一样的事情但是却不能互相替换。

 

什么是多播委托?

多播委托就是使用:+=关联多个方法,形成一个方法链。执行委托是会按照绑定委托的顺序逐一执行这个方法链。

移除委托关联:-= 会根据委托的方法链倒序移除方法,移除找到第一个吻合的方法,只移除一个。如果没有找到吻合的方法则什么事情也不发生。

如果是带返回值的多播委托,只返回最后一个执行的方法的返回值,前面的都会丢失。

GetInvocationList();这个方法可以获取委托实例里面所有的方法,返回的是单个委托实例,这个时候单个的委托实例就可以是使用异步多线程了。

多播委托执行期间发生未捕获的异常,则方法链执行结束。

注意问题:多播委托不能使用异步,BeginInvork()。

 

什么是事件?

事件就是加了Event修饰了的委托实例。

事件可以像多播委托+=一样绑定多个方法,也可以移除关联-=。

事件的用途:其实我们代码中很多地方都在使用事件,比如我们的Net Framework框架就是把固定的工作完成,变化的做成事件接口分离出去,由我们实现。

事件的三部曲:发布事件->订阅事件->关注者(随着事件触发也会跟着发生一些事情)

 

事件和委托对比:

事件就是委托的实例,委托则是一种类型。

使用Event修饰的委托实例叫做事件,提供了强大的安全性,不允许外部对其修改(实例的内部是可以修改的,比如=null),只允许对其进行+=关联事件,或-=断开事件。

不是用Event修饰过的委托实例,则没有安全性,比较开放,不管是内部还是外部都可以对其做任何修改。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值