源代码组件概览
需要在事件中使用的代码有5部分,如图15-4所示,后文会依次进行介绍。这些组件如下
所示
- 委托类型声明事件和事件处理程序必须有共同的签名和返回类型,它们通过委托类型
进行描述。 - 事件处理程序声明订阅者类中会在事件触发时执行的方法声明。它们不一定是显式命
名的方法,还可以是第14章描述的名方法或Lambda表达式。 - 事件声明发布者类必须声明一个订阅者类可以注册的事件成员。当类声明的事件为
public时,称为发布了事件。 - 事件注册订阅者必须注册事件才能在事件被触发时得到通知。这是将事件处理程序与
事件相连的代码。 - 触发事件的代码发布者类中“触发”事件并导致调用注册的所有事件处理程序的代码。
声明事件
发布者类必须提供事件对象。创建事件比较简单一一只需要委托类型和名称。事件声明的语
法如下面的代码所示,代码中声明了一个叫作countADozen的事件。注意如下有关CountedADozen
事件的内容。
- 事件声明在一个类中。
- 它需要委托类型的名称,任何附加到事件(如注册)的处理程序都必须与委托类型的签
名和返回类型匹配。 - 它声明为public,这样其他类和结构可以在它上面注册事件处理程序。
- 不能使用对象创建表达式(new表达式)来创建它的对象。
事件是成员
一个常见的误解是把事件视为类型,然而它不是。和方法、属性一样,事件是类或结构的成
员,这一点引出了几个重要的特性。
- 由于事件是成员:
- 我们不能在一段可执行代码中声明事件;
- 它必须声明在类或结构中,和其他成员一样。
- 事件成员被隐式自动初始化为null。
事件声明需要委托类型的名称,我们可以声明一个委托类型或使用已有的委托类型。如果声
明一个委托类型,它必须指定将被事件注册的方法的签名和返回类型。
BCL声明了一个叫作EventHandler的委托,专门用于系统事件,本章后面会介绍。