《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         }    

 

你可能感兴趣的:(读书笔记)