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),之后通过拆包获取自己想要的参数类型,举个栗子:

      • 事件的触发
        事件的触发就是通过调用事件里封装的委托字段的invoke()方法,遵守"先进先出"的原则调用其中的事件处理器。
        当然你可以写一个专门用来触发事件的事件触发器,上代码:

         

        事件触发器的签名据具体需求更改,不过最后一定别忘了调用委托字段的Invoke方法。触发事件时必须传与委托类型签名一致的参数。

posted @ 2020-04-04 17:46  可可苦力  阅读(787)  评论(0)    收藏  举报