C#事件,事件中的委托字段
-
-
- 事件的组成:
事件由五个基本部分组成,分别是:事件本身,事件响应者,事件处理器,事件拥有者,事件的订阅
事件本身:声明的一个具体事件
事件拥有者:谁声明了这个事件,谁就是事件的拥有者
事件的订阅:将事件处理器挂载到事件上
事件处理器:通常是一个类的一个方法,事件被触发时由处理器去做相关的工作
事件响应者:事件处理器所属的类 - 事件的声明
- 完整声明
可以看到,完整声明里,事件中有一个委托变量至关重要。可以认为事件是委托的一种封装,这种封装保护委托不被外界直接访问。
add关键字用来挂载事件处理器,remove关键字用来移除事件处理器 - 简要声明
可以直接使用public event EventHandler Order这段代码简要声明事件,而不需要去管事件中的逻辑。
简要声明中,事件实则还是封装了一个委托字段,只不过这个委托字段是被编译器隐式声明的(具体详见bilibili刘铁锰C#语言入门详解p20,p21,p22,具体哪个我给忘了,汗)
- 完整声明
-
声明委托类型以约束事件
- 使用事件时,可以用什么样的方法订阅事件取决于约束事件的委托类型,举个栗子,void(void)的事件里只能装void(void)的处理器,而别的像void(int),int(void)等等类型不匹配的方法是不能装进事件里的,强塞的话编译器大大过不去。
上面用到的EventHandler是微软提供的默认委托类型。
你可以自定义委托类型去约束自己的事件,就比如我的:

然后声明事件时变为public event OrderEventHandler 事件名,这里的OrderEventHandler就是自定义的委托类型。
不过一般情况下,用默认委托类型的情况多一点,因为我们自定义的事件处理器的签名大可改成void(object,EventArgs),之后通过拆包获取自己想要的参数类型,举个栗子:
- 使用事件时,可以用什么样的方法订阅事件取决于约束事件的委托类型,举个栗子,void(void)的事件里只能装void(void)的处理器,而别的像void(int),int(void)等等类型不匹配的方法是不能装进事件里的,强塞的话编译器大大过不去。
- 事件的触发
事件的触发就是通过调用事件里封装的委托字段的invoke()方法,遵守"先进先出"的原则调用其中的事件处理器。
当然你可以写一个专门用来触发事件的事件触发器,上代码:
事件触发器的签名据具体需求更改,不过最后一定别忘了调用委托字段的Invoke方法。触发事件时必须传与委托类型签名一致的参数。
- 事件的组成:
-

浙公网安备 33010602011771号