//第一步:定义类型来容纳所有需要发送给事件通知接受者的附加信息(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) ???? } } |