委托及事件的链表模型(从使用角度对其实现方式进行推测,不一定准确,但可以帮助理解)
来源:互联网 发布:养生网站源码 编辑:程序博客网 时间:2024/06/11 21:04
public delegate void EventHandler(object sender, System.EventArgs e);//委托类型的定义(感觉称作"声明"不合适)(定义的格式即该类委托节点(后面会提到)数据域中函数的签名)
public event EventHandler enChanged;//事件(event修饰的委托)
public EventHandler deChanged;//委托
委托(如EventHandler)是一个类, 用它定义的自然是对象(如enChanged、deChanged),这是一种集合类型,它不用(也不能,后面解释)显式的实例话,可以认为经过如上定义 后,deChanged是一个链表的头节点(已实例化),数据域(保存一个具有相同签名(返回值及参数列表一样,我这样理解^_^)的函数的指针)为空, next域为null,而+=和-=操作就是在链表里添加或删除相应节点,+=时在链尾添加,执行委托时(deChanged(sender,e);)遍历整个链表,依次调用各函数,所以调用有先后顺序之分,new EventHandler(abc)可以认为是建立一个链表节点(数据域为abc函数的指针)。(解释一下为什么说deChanged不能显式的实例化)那么
deChanged=new EventHandler(abc)是什么意思呢?可以这样理解:委托的‘=’运算附是经过重载的,它实际上是对头节点的next域进行赋值,而不是说这样生成的委托头节点就是new EventHandler(abc),这样就可以解释我们在像上面那样初始化之后,为什么还可以进行如下运算deChanged-=abc;
event是修饰委托类对象在定义时的所用的关键字,所以说事件就是一种用event关键字修饰的特殊的委托,是加了event限定的委托。
一个delegate引用被声明为event,即事件后,除了在声明它的类以外,在其他的地方你只能进行+=、-=操作(即所谓subscribe或unsubscribe),而不加时则没有这个限制。
为什么对事件要加这些限制呢?我是这样理解的:属于某个类或对象的事件,其处理方式自然只能是在这个类或对象本身感知到某事件发生时由他自己调用相应的处理函数而不能由外界调用,但具体怎么处理是由环境决定的,所以外界可以为其添加相应的事件处理函数,也就是说处理方式可由外界选择,但处理时机(对处理函数的调用)只能由定义该事件的类或对象决定。
不妥之处希望大家批评指正
- 委托及事件的链表模型(从使用角度对其实现方式进行推测,不一定准确,但可以帮助理解)
- 对C#委托及事件委托的理解
- 对C#委托及事件委托的理解
- 对C#委托及事件委托的理解
- 对C#委托及事件委托的理解(转)
- 对C#委托及事件委托的理解
- 对C#委托及事件委托的理解
- 对C#委托及事件委托的理解
- 对C#委托及事件委托的理解
- 对c#委托及事件委托的理解_c#应用
- 对事件与委托的理解(1) 使用事件
- 对事件委托的理解
- 从callback的角度来理解.NET/C# 中的 委托 (delegate)与 事件 (event)
- 从callback的角度来理解.NET/C# 中的 委托 (delegate)与 事件 (event)
- 从对象的角度理解委托以及委托链的返回值获取
- 面试题:有一句格言:“人不一定能使自己伟大,但一定可以使自己崇高”请你联系实际谈谈对这一格言的理解。
- 从数学角度对卷积的理解
- 我对委托与事件的理解
- CSS控制的文字段落左右对齐的样式
- 自己写一个通用的MessageBox(SDK实现)
- 住在我隔壁储藏室的大学刚毕业的小夫妻
- 框架制作之MVC
- 提高Excel VBA的执行效率
- 委托及事件的链表模型(从使用角度对其实现方式进行推测,不一定准确,但可以帮助理解)
- TCP和UDP协议简介
- JAVA电子书下载
- 2分法-通用存储过程分页(not in版本)
- [VS.NET 问题] 错误:源文件与模块生成时的文件不同! ,VS不能编译
- 其实:过去的就是过去了
- 精华!分享!军警格斗:特种兵系列之拳肘技术、腿膝技术 、徒手对刀等多种实用视频教学录像
- 寄存器惯常用法
- Perl: hello world