事件功能是由三个互相联系的元素提供的:提供事件数据的类、事件委托和引发事件的类。.NET Framework 具有命名与事件相关的类和方法的约定。如果希望您的类引发一个名为 EventName 的事件,您需要以下元素:
-
包含事件数据的类,名为 EventNameEventArgs。该类必须从 System.EventArgs 导出。
-
事件的委托,名为 EventNameEventHandler。
-
引发事件的类。该类必须提供事件声明 (EventName) 和引发事件 (OnEventName) 的方法。
.NET Framework 类库或第三方类库中可能已经定义了事件数据类和事件委托类。在这种情况下,您就不需要定义这些类了。例如,如果您的事件不使用自定义数据,可以使用 System.EventArgs 作为事件数据并使用 System.EventHandler 作为委托。
使用 event 关键字在类中定义事件成员。当编译器在类中遇到 event 关键字时,它会创建一个私有成员,例如:
private EventNameHandler eh = null;
编译器还会创建两个公共方法,即 add_EventName 和 remove_EventName。这些方法是事件挂钩,它们允许委托与事件委托 eh 合并或从该事件委托中移除。这些详细信息对程序员是隐藏的。
![]() |
---|
在除 C# 和 Visual Basic 2005 以外的其他语言中,编译器可能不自动生成与事件成员对应的代码,您可能需要显式地定义事件挂钩和私有委托字段。 |
定义事件实现后,您必须确定引发事件的时间。通过在定义事件的类或派生类中调用受保护的 OnEventName 方法来引发事件。OnEventName 方法通过调用委托,传入所有事件特定的数据来引发事件。事件的委托方法可以执行事件操作或处理事件特定的数据。
![]() |
---|
受保护的 OnEventName 方法也允许派生类重写事件,而不必向其附加委托。派生类必须始终调用基类的 OnEventName 方法以确保注册的委托接收到事件。 |