首页 > 代码库 > 《CLR via C#》事件

《CLR via C#》事件

  • 设计要公开事件的类型
 1     //定义类型来容纳所有需要发送给事件通接收者的附加信息 2     internal class NewMailEventArgs : EventArgs 3     { 4         private readonly string m_from, m_to, m_subject; 5         public NewMailEventArgs(string from, string to, string subject) 6         { 7             m_from = from; 8             m_to = to; 9             m_subject = subject;10         }11 12         public string From { get { return m_from; } }13         public string To { get { return m_to; } }14         public string Subject { get { return m_subject; } }15     }
 1     internal class MailManager 2     { 3         public event EventHandler<NewMailEventArgs> NewMail;//定义事件成员 4  5         //定义一个负责引发事件的方法,它通知已登记的对象 6         protected virtual void OnNewMail(NewMailEventArgs e) 7         { 8             EventHandler<NewMailEventArgs> temp = Interlocked.CompareExchange(ref NewMail, null, null);//避免事件竞态问题 9             if (temp != null)10             {11                 temp(this, e);12             }13         }14 15         //定义方法将输入转化为期望事件16         public void SimulateNewMail(string from, string to, string subject)17         {18             NewMailEventArgs e = new NewMailEventArgs(from, to, subject);19             OnNewMail(e);20         }21     }
  • 设计侦听事件的类型
 1     //设计侦听事件类型的事件 2    internal class Fax 3     { 4        public Fax(MailManager mm) { 5            mm.NewMail += mm_NewMail; 6        } 7  8       public void mm_NewMail(object sender, NewMailEventArgs e) 9        {10            //throw new NotImplementedException();11            Console.WriteLine("{0}--->{1}:{2}", e.From, e.To, e.Subject);12        }13 14       public void Unregister(MailManager mm) {15           mm.NewMail -= mm_NewMail;//移除事件16       }17     }

技术分享

MailManager提供一个NewMail事件;构造Fax对象时,它向MailManager的NewMail事件登记了自己的一个实例方法,这样一来新的邮件到达时,MailManager就知道通知Fax对象;在某个时刻,当MailManager接收到一封新的电子邮件时,会引发NewMail事件,所有已登记的方法都会有机会以自己的方式处理新邮件

 

《CLR via C#》事件