委托及事件的链表模型(从使用角度对其实现方式进行推测,不一定准确,但可以帮助理解)

来源:互联网 发布:养生网站源码 编辑:程序博客网 时间: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,即事件后,除了在声明它的类以外,在其他的地方你只能进行+=-=操作(即所谓subscribeunsubscribe,而不加时则没有这个限制。

为什么对事件要加这些限制呢?我是这样理解的:属于某个类或对象的事件,其处理方式自然只能是在这个类或对象本身感知到某事件发生时由他自己调用相应的处理函数而不能由外界调用,但具体怎么处理是由环境决定的,所以外界可以为其添加相应的事件处理函数,也就是说处理方式可由外界选择,但处理时机(对处理函数的调用)只能由定义该事件的类或对象决定。

不妥之处希望大家批评指正

原创粉丝点击