16.3 如何声明事件

声明事件的语法和定义一个类的成员非常相似,也非常简单。事实上,事件就是类成员的一种,只是事件定义中包含一个特殊的关键字:event,如图16-3所示。

从图16-3可以发现,一个事件的声明代码中,确实存在一个委托类型。其中,该“委托类型”部分可以自定义,既可以使用预定义的委托类型EventHandler,也可以使用自定义委托类型。因此这也对应着事件声明的两种方式:

❑采用自定义委托类型。

16.3 如何声明事件 - 图1

图 16-3 事件的声明

❑采用EventHandler预定义委托类型。

这两种方式基本相同,只不过第二种是.N e t Framework中普遍采用的一种形式,因此建议尽量采用第二种方式。在本节中也首先介绍第二种方式,第一种方式请参阅17.7节内容。

EventHandler是在BCL中预定义的委托类型,它位于System命名空间,用以处理不包含事件数据的事件。事件如果需要包含事件数据,可以通过派生EventArgs实现,后文会有专门叙述。先来看下EventHandler委托的签名,可见它带有两个参数:


public delegate void EventHandler(Object sender,EventArgs e);从EventHandler委托的签名可以得到如下信息:


❑委托的返回类型为void;

❑第一个参数——sender参数,它负责保存触发事件的对象的引用,因为参数的类型是Object类型,因此它可以保存任何类型的实例;

❑第二个参数——e参数,它负责保存事件数据,这里是在BCL中定义的默认的EventArgs类,它位于System命名空间中,它不能保存任何数据,关于EventArgs的更多信息,请参阅第16.6节。另外,也可以定义一个静态的事件成员,如:


public static event EventHandler PrintComplete;