事件和委托

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

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

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

public delegate void EventNameEventHandler(object sender, EventNameEventArgs e);

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

由此可见,事件功能应由三个互相联系的元素提供的:提供事件数据的类、事件委托和引发事件的类。.NET Framework 具有命名与事件相关的类和方法的约定。如果希望您的类引发一个名为 EventName 的事件,您需要以下元素:

·包含事件数据的类,名为 EventNameEventArgs。此类必须是从 System.EventArgs 派生的。
·事件的委托,名为 EventNameEventHandler。
·引发事件的类。该类必须提供事件声明 (EventName) 和引发事件 (OnEventName) 的方法。
·事件处理程序。该方法必须具有和事件委托相同的签名,并在事件引发前进行注册,在事件引发后调用。

注:.NET Framework 类库或第三方类库中可能已经定义了事件数据类和事件委托类。在这种情况下,您就不需要定义这些类了。例如,如果您的事件不使用自定义数据,您可以使用 System.EventArgs 作为事件数据并使用 System.EventHandler 作为委托。

下边我们先来定义一个类,并定义了一个事件(EventName):

public class EventNameClass
{
    //委托
    public delegate void EventNameEventHandler(object sender, EventArgs e);

    //事件
    public event EventNameEventHandler EventName;

    /// <summary>
    /// 引发事件方法
    /// </summary>
    /// <param name="e"></param>
    public void OnEventName(EventArgs e)
    {
        if (EventName != null) EventName(this, e);
    }
}

接下来我们定义一个事件处理程序,并进行注册,然后用程序引发事件:

/// <summary>
/// 事件处理程序
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void EventMethod(object sender, EventArgs e)
{
    MessageBox.Show("事件处理程序被调用了!");
}

/// <summary>
/// 注册事件处理程序并引发事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
    EventNameClass obj = new EventNameClass();
    obj.EventName += new EventNameClass.EventNameEventHandler(EventMethod);
    EventArgs e1 = new EventArgs();
    obj.OnEventName(e1);
}


参考文章

事件和委托:http://msdn.microsoft.com/zh-cn/library/17sde2xt.aspx
如何:将事件处理程序方法连接到事件:http://msdn.microsoft.com/zh-cn/library/xwbwks95.aspx
使用事件:http://msdn.microsoft.com/zh-cn/library/2ccyd347.aspx
引发事件:http://msdn.microsoft.com/zh-cn/library/wkzf914z.aspx

上一篇: C#订阅事件的几种方法
下一篇: 气泡提示
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
最新日志:
评论: 0 | 引用: 0 | 查看次数: 3831
发表评论
登录后再发表评论!