Events
event,a type that defines an event member allows the type(or instances of the type) to notify other objects that something special has happiend.
事件:定义事件成员的类型允许类型(或者类型的实例)在某些特定事情发生时通知其它对象。事件是基于委托机制上,委托是提供一种安全调用回调方法的类型。
一、定义事件
1、保存事件接受者所需的全部信息,类型继承自System.EventArgs,FCL定义如下:
[Serializable] public class EvenArgs { public static readonly EventArgs Empty = new EventArgs(); public EventArgs() { } }
2、指定事件触发时被调用的方法原型,如果定义的事件没有需要传递给事件接受的附加信息信息,可直接使用FCL中的System.EventHandler的定义如下:
public delegate void EventHandler(object sender, EventArgs e);
3、定义事件成员
public event EventHandler SmapleEvent;
4、定义负责通知事件的登记对象
protected virtual void NotifySubscriber(EventHandler e) { if (SmapleEvent!= null) { SmapleEvent(this, e); } }
5、感应外部操作触发事件
public void FireEvent(EventHandler e) { NotifySubscriber(e); }
6、侦听事件
注册: sampleEvent += new EventHandler(SubscriberMethod);
注销: smapleEvent –= new EventHandler(subscriberMethod);
private void subscriberMethod( object sender, EventArgs e) { Console.WriteLine(" Process the message in its disires"); }
二、事件的真相
程序员眼中的event:
public event EventHandler sampleEvent;
编译器眼中的event:
private EventHandler sampleEvent =null; [MethodImplAttribute(MethodImplOptions.Synchronized)] public void add_*(EventHandler handler) { sampleEvent = (EventHandler)Delegate.Combine(sampleEvent, handler); } [MethodImplAttribute(MethodImplOptions.Synchronized)] public void remove_*(EventHandler handler) { sampleEvent = (EventHandler)Delegate.Remove(sampleEvent, handler); }
注意:
a.源代码中公有的事件,编译器将其转化为私有的委托字段。
b.通过combine 和 Remove 方法操作委托链。
c.combine 和 Remove方法应用MethodImplAttribute特性,使其同步安全,多个侦听者同时登记或注销事件,也不会损坏委托链。
三、显式控制事件注册
class MailManage { public class MailMsgEventArgs : EventArgs { } public delegate void MailMsgEventHandler(object sender, MailMsgEventArgs args); //显式定义委托链表字段 private MailMsgEventHandler mailMsgEventHandlerDelegate; //显式定义事件及其访问器方法 public event MailMsgEventHandler MailMsg { add { mailMsgEventHandlerDelegate = (MailMsgEventHandler)Delegate.Combine(mailMsgEventHandlerDelegate, value); } remove { mailMsgEventHandlerDelegate = (MailMsgEventHandler)Delegate.Remove(mailMsgEventHandlerDelegate, value); } } protected virtual void OnMailMsg(MailMsgEventArgs e) { //判断委托字段而非事件名称 if (mailMsgEventHandlerDelegate != null) { mailMsgEventHandlerDelegate(this, e); } } public void FireEvent(MailMsgEventArgs e) { OnMailMsg(e); } }
参照:.net框架程序设计