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框架程序设计
posted @ 2009-08-31 22:28  guzufeng  阅读(303)  评论(0编辑  收藏  举报