先做事后做人

博客园 首页 新随笔 联系 订阅 管理

处理和引发事件之一:事件和委托

.NET Framework 中的事件是基于委托模型的。(那些熟悉面向对象编程中设计模式的人将注意到观察程序设计模式。)

事件和委托

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

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

委托是一个可以对方法进行引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。虽然委托具有许多其他的用途,但这里只讨论委托的事件处理功能。

示例:public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);

委托的实例可以绑定到任何一个与其签名匹配的方法上。如下:

public class WakeMeUp
{
// AlarmRang has the same signature as AlarmEventHandler.
public void AlarmRang(object sender, AlarmEventArgs e){...};
...
}

AlarmRang 连接(连结)到 Alarm 事件:

WakeMeUp w = new WakeMeUp();

AlarmEventHandler alhandler = new AlarmEventHandler(w.AlarmRang);

现在,只要调用 alhandler,就会相应调用 WakeMeUp 实例的 AlarmRang 方法

Alarm 事件注册 alhandler 委托。

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

delegate void EventHandler(object sender, EventArgs e);

 

 

posted on 2006-03-15 14:34  asdfasdf  阅读(203)  评论(0)    收藏  举报