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框架程序设计