前言
关于委托前面已经写了:
C#中委托(delegate)和多播委托的理解
Action和Func泛型委托,委托,泛型,匿名函数,Lambda表达式的综合使用
其实初衷是为了解WinFrom中的控件或者COM组件中的各种事件运行的机制,里面涉及的知识整理起来还是比较多的,各种类型的委托,事件,和泛型等。
这里先整理事件(event),然后通过几个实例了解架构中的事件从激活到调用回调函数的具体过程。
事件(event
)
事件的官方文档
事件基于委托,为委托提供了一种发布/订阅机制,
- 可将事件理解为一种特殊用途的委托,或者说是受限制的委托,是委托一种特殊应用;
- 事件里面其实就两个方法(即
add_event()
和remove_event()
)和一个私有的委托变量,这两个方法里面分别是对这个私有的委托变量进行的合并和移除,当调用事件的 += 时其实是调用的事件里面的add_event()
方法,同样 -= 调用的是remove_event()
方法; - 事件只能够从对象外部增加新的响应方法和删除已知的响应方法,而不能主动去触发事件和获取其他注册的响应方法等信息。如果使用公有的delegate则不能做这些限制,也就是说事件对委托做了限制,使委托使用起来更加方便。
可以以下面这个图来理解:
从图中我们可以理解什么是发布者和订阅者,
且为什么说事件是特殊用途的委托,是受限制的委托?
限制一:不同于委托和类同级(可以在类的外边或者里边声明),事件只能在类中声明;