事件和委托

事件是对象发送的消息,以发信号通知操作的发生。 操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。 引发事件的对象称为事件发送方。 捕获事件并对其作出响应的对象叫做事件接收方。

在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。 所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。 .NET Framework 定义了一个特殊的类型 (Delegate),该类型提供函数指针的功能。

委托是可保存对方法的引用的类。 与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。 这样,委托就等效于一个类型安全函数指针或一个回调。 虽然委托具有许多其他的用途,但这里只讨论委托的事件处理功能。 一个委托声明足以定义一个委托类。 声明提供委托的签名,公共语言运行时提供实现。 下面的示例显示了事件委托声明。

Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
public delegate void AlarmEventHandler(Object^ sender, AlarmEventArgs^ e);

该语法与方法声明的语法相似,但是 delegate 关键字通知编译器 AlarmEventHandler 是一个委托类型。 按照约定,.NET Framework 中的事件委托有两个参数:引发事件的源和该事件的数据。

AlarmEventHandler 委托的实例可以绑定到任何一个与其签名匹配的方法上,例如下面的示例中显示的 WakeMeUp 类的 AlarmRang 方法。

Public Class WakeMeUp
    ' AlarmRang has the same signature as AlarmEventHandler.
    Public Sub AlarmRang(sender As Object, e As AlarmEventArgs)
        '...
    End Sub
    '...
End Class
public class WakeMeUp
{
    // AlarmRang has the same signature as AlarmEventHandler.
    public void AlarmRang(object sender, AlarmEventArgs e)
    {
        //...
    }
    //...
}
public ref class WakeMeUp
{
public:
    // AlarmRang has the same signature as AlarmEventHandler.
    void AlarmRang(Object^ sender, AlarmEventArgs^ e)
    {
        //...
    }
    //...
};

只有当事件生成事件数据时才需要自定义事件委托。 许多事件,包括一些用户界面事件(例如鼠标单击)在内,都不生成事件数据。 在这种情况下,类库中为无数据事件提供的事件委托 System.EventHandler 便足够了。 其声明如下。

Delegate Sub EventHandler(sender As Object, e As EventArgs)
delegate void EventHandler(object sender, EventArgs e);
delegate void EventtHandler(Object^ sender, EventArgs^ e);

事件委托是多路广播的,这意味着它们可以对多个事件处理方法进行引用。 有关详细信息,请参见 Delegate。 委托考虑了事件处理中的灵活性和精确控制。 通过维护事件的已注册事件处理程序列表,委托为引发事件的类担当事件发送器的角色。

有关使用委托在您的组件或控件中提供事件功能的详细信息,请参见引发事件

有关在您的应用程序中使用事件的概述,请参见使用事件

请参见

任务

如何:引发和使用事件

如何:将事件处理程序方法连接到事件

概念

使用事件

引发事件

其他资源

处理和引发事件