《CLR via C#》读书笔记 之 事件
第十一章 事件
2013-02-27
11.1 设计要公开事件的类型
11.3 设计侦听事件的类型
11.4客户端操作
ToDo: 用uml把类的关系画出来
为了帮助理解事件如何工作,先描述一个和事件相关的场景。假定现在要设计一个电子邮件系统,它的功能是:当邮件到达时,用户可以设置将邮件发送给传真机或寻呼机。
11.1 设计要公开事件的类型
第一步:定义一个类型来容纳发送给事件通知者的信息
第二步:定义事件成员
第三步:定义一个负责引发事件的方法,它通知已登记对象
第四步:定义方法将输入转化为期望事件
1 //step1:定义一个类型来容纳发送给事件通知者的信息 2 class NewMailEventArgs : EventArgs 3 { 4 private readonly String m_from, m_to, m_subject; 5 public String From { get { return m_from; } } 6 public String To { get { return m_to; } } 7 public String Subject { get { return m_subject; } } 8 9 public NewMailEventArgs(String from, String to, String subject) 10 { 11 m_from = from; m_to = to; m_subject = subject; 12 } 13 } 14 15 class MailManager 16 { 17 //step2: 定义事件成员 18 public event EventHandler<NewMailEventArgs> NewMail; 19 20 //step3:定义一个负责引发事件的方法,它通知已登记对象 21 protected virtual void OnNewMail(NewMailEventArgs e) 22 { 23 //// .net framework最初发表时引发事件方式 24 //if (NewMail != null) NewMail(this, e); 25 26 //定义方法将输入转化为期望事件 27 EventHandler<NewMailEventArgs> temp = System.Threading.Interlocked.CompareExchange(ref NewMail, null, null); 28 //任何方法登记了对事件的关注,通知他们 29 if (temp != null) temp(this, e); 30 } 31 32 //step4:定义方法将输入转化为期望事件 33 public void SimulateNewMail(String from, String to, String subject) 34 { 35 NewMailEventArgs e = new NewMailEventArgs(from, to, subject); 36 OnNewMail(e); 37 } 38 }
11.3 设计侦听事件的类型
1 class Fax 2 { 3 public Fax(MailManager mm) 4 { 5 mm.NewMail += FaxMsg; 6 } 7 8 private void FaxMsg(Object sender, NewMailEventArgs e) 9 { 10 Console.WriteLine("Faxing mail message:"); 11 Console.WriteLine(" From={0}, To={1}, Subject={2}", e.From, e.To, e.Subject); 12 } 13 14 public void Unregister(MailManager mm) 15 { 16 mm.NewMail -= FaxMsg; 17 } 18 }
11.4客户端操作
1 static void Main(string[] args) 2 { 3 MailManager manager = new MailManager(); 4 Fax fax = new Fax(manager); 5 manager.SimulateNewMail("北京", "上海", "通知"); 6 fax.Unregister(manager); 7 manager.SimulateNewMail("上海", "北京", "通知"); 8 Console.Read(); 9 }