.net中的delegate和event

来源:互联网 发布:南风知我意txt微盘 编辑:程序博客网 时间:2024/05/01 02:26
本文内容出自.net framework programming(正在完善中)
  1. class MailManager
  2.     {
  3.         public class MailMsgEventArgs : EventArgs
  4.         {
  5.            //1.传递给事件接受者的类型定义信息
  6.             public MailMsgEventArgs(String from, String to, String subject, String body)
  7.             {
  8.                 this.from = from;
  9.                 this.to = to;
  10.                 this.subject = subject;
  11.                 this.body = body;
  12.             }
  13.             public readonly String from, to, subject, body;
  14.         }
  15.         //2.下面的委托类型定义了接收者必须实现的回调方法
  16.         public delegate void MailMsgEventHandler(object sender,MailMsgEventArgs e);
  17.         //3.事件成员
  18.         public event MailMsgEventHandler MailMsg;
  19.         //4.下面的受保护虚方法负责通知事件的登记对象
  20.         protected virtual void OnMailMsg(MailMsgEventArgs e)
  21.         {
  22.             //有对象登记事件吗?
  23.             if (MailMsg != null)
  24.             {
  25.                 MailMsg(this,e);
  26.             }
  27.         }
  28.         //5.下面的方法将输入转化为期望的事件,该方法在新的电子邮件消息到达时被调用
  29.         public void SimulateArrivingMsg(String from, String to, String subject, String body)
  30.         {
  31.            //构造一个对象保存希望传递给通知接收者的信息
  32.             MailMsgEventArgs e = new MailMsgEventArgs(from, to, subject, body);
  33.             //调用虚方法通知对象事件已发生
  34.             //如果派生类型没有重写改虚方法,对象将通知所有登记的事件侦听者
  35.             OnMailMsg(e);
  36.         }
  37.     }

 

 

2.C#编译器会将这段代码编译成三个构造   

 

  1.    public event MailMsgEventHandler MailMsg;
  2.       
  3.   //[1],一个被初始化为NULL的私有委托类型字段  
  4.         private MailMsgEventHandler MailMsg = null;
  5.         //[2].一个允许对象登记事件的公有add_*方法  
  6.         [MethodImplAttribute(MethodImplOptions.Synchronized)]
  7.         public void add_MailMsg(MailMsgEventHandler  handler)
  8.         {
  9.             MailMsg = (MailMsgEventHandler)Delegate.Combine(MailMsg , Handler);
  10.         }
  11.        //. [3]一个允许对象注销事件的公有remove_*方法  
  12.           [MethodImplAttribute(MethodImplOptions.Synchronized)]
  13.         public void remove_MailMsg(MailMsgEventHandler  handler)
  14.         {
  15.             MailMsg = (MailMsgEventHandler)Delegate.Remove(MailMsg , Handler);
  16.         }

3.当C#编译器遇到这段代码时,它会产生如下所示的一个完整的类定义:

public delegate void MailMsgEventHandler(object sender,MailMsgEventArgs e);

  1. public class MailMsgEventHandler:System.MulticastDelegate
  2. {
  3.    //构造器
  4.    public MailMsgEventHandler(object target,Int32 methodsPtr);
  5.    //下面的方法和源代码中指定的原型一样
  6.    public void virtual Invoke(Object sender,MailMsgEventArgs e);
  7.    //下面的方法允许我们对委托进行异步回调
  8.     public virtual IAsynResult BeginInvoke(
  9.          Object   sender,MailMsgEventArgs e,
  10.          AsyncCallback callback,Object object);
  11.     public virtual void EndInvoke(IAsyncResult result)
  12. }

原创粉丝点击