首页 > 代码库 > 第14章 事件

第14章 事件

  • 事件基于委托,为委托提供了一种发布机制, 事件是成员,是对象,而不是类型.

    So: 必须声明在类或者结构中; 被隐式初始化为null.

  • 几个概念:

    发布者( publisher )

    订阅者( subscriber )

    事件处理程序( event handler )

    触发(raise ) 事件调用( invoke ) 或触发( fire )

  • 事件封装了一个私有的委托

    技术分享

  • 使用事件的5个源代码组件

    技术分享

  • 具体如图
  • 技术分享

    ??

  • 声明事件:
    • 技术分享
    • 技术分享
    • 技术分享
  • 事件声明需要委托类型的名字,必须指定事件保存的方法的签名和返回值类型.更好的方案是EventHandler委托

    ??

  • 技术分享
  • 使用自定义委托:
    • 使用非泛型委托:

      public delegate void MyEventHandler (object sender, MyEventArgs e)

      ??

    • 使用泛型委托:

      //public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e); //EventHandler的原型

      public delegate void EventHandler<MyEventArgs> EventX; //声明事件

  • 订阅事件 +=

    事件处理程序可以是以下任意一种:

    • 实例方法的名称;
    • 静态方法的名称;
    • 匿名方法;
    • Lambda表达式
  • 触发事件,使用方法同调用函数类似:
    • 使用事件名称,后面跟的参数列表包含在圆括号中;
    • 参数列表必须与事件的委托类型相匹配。

    技术分享

  • 移除事件处理方法:

    如果一个处理程序向事件注册了多次,那么当执行命令移除处理程序时,将只移除列表中该

    处理程序的最后一个实例。

  • 定义事件访问器 (事件访问器表现为Void 方法,不能使用return语句)

    技术分享

  • 注意: 声明了事件访问器之后,事件不再包含任何内嵌的委托对象; 必须手动实现存储和移除事件的方法.

    ??

    ??

    ??

    ??

    ??

第14章 事件