委托和事件的原理

您所在的位置:网站首页 委托事件模型的原理是 委托和事件的原理

委托和事件的原理

2024-07-03 16:54| 来源: 网络整理| 查看: 265

什么叫做委托?

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

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

那么委托有什么用呢?

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

Action和Func泛型委托:

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

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

Action和Func的由来:

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

 

什么是多播委托?

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

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

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

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

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

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

 

什么是事件?

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

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

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

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

 

事件和委托对比:

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

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3