C# 事件模型(基于委托)实例参考

流程:邮件发送成功后 ------ 触发事件 ------> 传真机开始执行相关操作

 

 

定义邮件类:

using System; /* 定义事件 */ class MailManager { #region 定义内部MailMsgEventArgs类型,用于记录事件附加属性 public class MailMsgEventArgs : EventArgs { //只读变量字段成员 public readonly String from, to, subject, body; //MailMsgEventArgs类的构造函数 public MailMsgEventArgs(String from, String to, String subject, String body) { //初始化只读变量字段成员 this.from = from; this.to = to; this.subject = subject; this.body = body; } } #endregion //定义MailMsgEventHandler类型的委托,接收2个参数,无返回值的方法 public delegate void MailMsgEventHandler(Object sender, MailMsgEventArgs args); //定义事件成员对象MailMsg(委托MailMsgEventHandler的实例) /* C#编译器会将此代码编译为以下3个构造 * 1.即使源代码中定义的是公有事件,委托字段MailMsg也总私有(防止类型外的代码操作,误删登记事件的委托实例) * private MailMsgEventHandler MailMsg = null; * 2.一个允许对象登记事件的“公有”add_* 方法,总调用System.Delegate静态Combine方法,将委托实例添加到委托链表,后返回链表首部 * public void add_MailMsg(MailMsgEventHandler handler){ MailMsg = (MailMsgEventHandler)Delegate.Combine(MailMsg, handler); } * 3.一个允许对象注销事件的“公有”remove_* 方法,总调用System.Delegate静态Remove方法,将委托实例从委托链表移除,返回链表首部 * public void remove_MailMsg(MailMsgEventHandler handler){ MailMsg = (MailMsgEventHandler)Delegate.Remove(MailMsg, handler); } * * 因为MailMsg的访问修饰符是public,因此add_MailMsg,remove_MailMsg也为public */ public event MailMsgEventHandler MailMsg; //负责通知事件的登记对象 protected virtual void OnMailMsg(MailMsgEventArgs e) { if (MailMsg != null) { MailMsg(this, e); } } //模拟发送邮件成功后调用OnMailMsg方法,通知事件的登记对象 public void SimulateArrivingMsg(String from, String to, String subject, String body) { MailMsgEventArgs e = new MailMsgEventArgs(from, to, subject, body); OnMailMsg(e); } }

 

传真机类:

using System; /* 登记事件 */ class Fax { //构造函数,传入MailManager对象,在其上登记事件 public Fax(MailManager mm) { //C#编译器生成:mm.add_MailMsg(new MailManager.MailMsgEventHandler(FaxMsg)); //登记一个事件 //mm.MailMsg += new MailManager.MailMsgEventHandler(FaxMsg); mm.MailMsg += FaxMsg; } //定义事件发生后执行的方法 private void FaxMsg(Object sender, MailManager.MailMsgEventArgs e) { Console.WriteLine("事件发送对象:" + sender.GetType().FullName); Console.WriteLine("传真机响应邮件事件"); Console.WriteLine("来自:{0} 发给:{1} 主题:{2} 正文:{3}", e.from, e.to, e.subject, e.body); } //注销事件 public void Unregister(MailManager mm) { MailManager.MailMsgEventHandler callback = new MailManager.MailMsgEventHandler(FaxMsg); //C#编译器生成:mm.remove_MailMsg(callback); mm.MailMsg -= callback; } }

 

Main()程序入口:

static void Main(string[] args) { //创建邮件对象 MailManager mm = new MailManager(); //创建传真机对象其,登记事件 Fax fx = new Fax(mm); //传真机注销事件登记 //fx.Unregister(mm); //邮件发送成功,通知其事件的登记对象,执行相关操作 mm.SimulateArrivingMsg("66","77","Hello","Cold!"); Console.Read(); }

 

/* C#中事件产生和实现的流程: 1.定义A为产生事件的实例,a为A产生的一个事件 2.定义B为接收事件的实例,b为处理事件的方法 3.A由于用户(程序编写者或程序使用者)或者系统产生一个a事件(例如点击一个Button,产生一个Click事件) 4.A通过事件列表中的委托对象将这个事件通知给B 5.B接到一个事件通知(实际是B.b利用委托来实现事件的接收) 6.调用B.b方法完成事件处理 */ public class A { public delegate void EventHandler(object sender); public event EventHandler a; public void Run() { Console.WriteLine("Trigger an event."); a(this); } } class B { public B(A a) { //a.a += new A.EventHandler(this.b); a.a += b; } private void b(object sender) { Console.WriteLine("Received and handled an event." ); Console.Read(); } }

你可能感兴趣的:(object,String,C#,Class,callback,编译器)