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

你可能感兴趣的:(event)