本文内容出自.net framework programming(正在完善中)
- class MailManager
- {
- public class MailMsgEventArgs : EventArgs
- {
- //1.传递给事件接受者的类型定义信息
- public MailMsgEventArgs(String from, String to, String subject, String body)
- {
- this.from = from;
- this.to = to;
- this.subject = subject;
- this.body = body;
- }
- public readonly String from, to, subject, body;
- }
- //2.下面的委托类型定义了接收者必须实现的回调方法
- public delegate void MailMsgEventHandler(object sender,MailMsgEventArgs e);
- //3.事件成员
- public event MailMsgEventHandler MailMsg;
- //4.下面的受保护虚方法负责通知事件的登记对象
- protected virtual void OnMailMsg(MailMsgEventArgs e)
- {
- //有对象登记事件吗?
- if (MailMsg != null)
- {
- MailMsg(this,e);
- }
- }
- //5.下面的方法将输入转化为期望的事件,该方法在新的电子邮件消息到达时被调用
- public void SimulateArrivingMsg(String from, String to, String subject, String body)
- {
- //构造一个对象保存希望传递给通知接收者的信息
- MailMsgEventArgs e = new MailMsgEventArgs(from, to, subject, body);
- //调用虚方法通知对象事件已发生
- //如果派生类型没有重写改虚方法,对象将通知所有登记的事件侦听者
- OnMailMsg(e);
- }
- }
2.C#编译器会将这段代码编译成三个构造
- public event MailMsgEventHandler MailMsg;
- //[1],一个被初始化为NULL的私有委托类型字段
- private MailMsgEventHandler MailMsg = null;
- //[2].一个允许对象登记事件的公有add_*方法
- [MethodImplAttribute(MethodImplOptions.Synchronized)]
- public void add_MailMsg(MailMsgEventHandler handler)
- {
- MailMsg = (MailMsgEventHandler)Delegate.Combine(MailMsg , Handler);
- }
- //. [3]一个允许对象注销事件的公有remove_*方法
- [MethodImplAttribute(MethodImplOptions.Synchronized)]
- public void remove_MailMsg(MailMsgEventHandler handler)
- {
- MailMsg = (MailMsgEventHandler)Delegate.Remove(MailMsg , Handler);
- }
3.当C#编译器遇到这段代码时,它会产生如下所示的一个完整的类定义:
public delegate void MailMsgEventHandler(object sender,MailMsgEventArgs e);
- public class MailMsgEventHandler:System.MulticastDelegate
- {
- //构造器
- public MailMsgEventHandler(object target,Int32 methodsPtr);
- //下面的方法和源代码中指定的原型一样
- public void virtual Invoke(Object sender,MailMsgEventArgs e);
- //下面的方法允许我们对委托进行异步回调
- public virtual IAsynResult BeginInvoke(
- Object sender,MailMsgEventArgs e,
- AsyncCallback callback,Object object);
- public virtual void EndInvoke(IAsyncResult result)
- }