| //第一步:定义类型来容纳所有需要发送给事件通知接受者的附加信息(P222 last) public class a { ????private string m_name; ????public string name ????{ ????????get{return m_name;} ????????protected set{m_name = value;} ????} } internal class NewMailEventArgs : EventArgs { ????private readonly string m_from,m_to,m_subject; ????public NewMailEventArgs(string from,string to,string subject) ????{ ????????m_from = from;m_to = to,m_subject = subject; ????} ????public string From{get{return m_from;}} ????public string To{get{return m_to;}} ????public string Subject{get{return m_subject;}} } //第二步:定义事件成员-event(P223 last) //每个事件成员都要指定一下内容:可访问性标识符;委托类型,指出要调用的方法的原型;名称(可以是有效标识符) iinternal class MailManager { ????public event EventHandler<NewMailEventArgs> NewMail; } //第三步:定义负责引发事件的方法来通知事件的登记对象(P224 last) //类需要定义一个受保护的虚方法,引发事件时,类及其派生类中的代码会调用该方法。 internal class MailManager { //第三步:定义负责引发事件的方法来通知已登记的对象。 //如果类是密封的,该方法要声明为私有和非虚 ????protected virtual void OnNewMail(NewMailEventArgs e) ????{ //出于线程安全的考虑,现在将对委托字段的引用复制到一个临时变量中(P225 1) ????????EventHandler<NewMailEventArgs > temp = Volatile.Read(ref NewMail); //任何方法登记了对事件的关注,就通知它们 ????????if(temp != null) temp(this,e); ????} } //第四步:定义方法将输入转化为期望事件(P226 4) internal class MailManager { ????public void SimulateNewMail(string from,string to,string subject) ????{ ????????NewMailEventArgs e = new NewMailEventArgs(from,to,subject); //调用虚方法通知对象事件已经发生 //如果没有类型重写该方法,我们的对象将通知事件的所有登记对象 ????????OnNewMail(e) ????} } |