CLR via C# 读书笔记 事件

1、什么是事件

  事件是类的一种成员。负责类或对象之间的消息通知。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订阅者”。

  • 发行者
    定义事件成员
    定义引发事件的方法(通过此方法通知事件的登记对象)
    定义方法将输入转化为期望的事件(引发事件的方法)
  • 订阅者  
    注册在事件成员被触发时调用的方法
  • 消息(发行者通过事件向订阅者传递的信息)
    类派生自System.EventArgs

2、事件的特点

  • 发行者确定何时引发事件,订户确定执行何种操作来响应该事件
  • 一个事件可以有多个订户。 一个订户可处理来自多个发行者的多个事件
  • 没有订户的事件永远也不会引发
  • 事件通常用于通知用户操作,例如,图形用户界面中的按钮单击或菜单选择操作
  • 如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序
  • 在 .NET Framework 类库中,事件是基于EventHandler委托和EventArgs基类的

3、怎样定义一个事件程序

这是一个电子邮件到达通知的例子,当电子邮件到达时,会引发NewMail事件,而注册到这个事件上的Fax和Pager都会收到通知,并以自己的方式处理该邮件。

定义一个消息

View Code
    public 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; }
        }
    }

发布者类

View Code
    public class MailManger
    {
        /// <summary>
        /// 定义事件成员
        /// </summary>
        public event EventHandler<NewMailEventArgs> NewMail;
        /// <summary>
        /// 定义引发事件的方法(通过此方法通知事件的登记对象)
        /// </summary>
        /// <param name="e">传递的信息</param>
        protected virtual void OnNewMail(NewMailEventArgs e) {
            if (NewMail!=null)
            {
                NewMail(this, e);
            }
        }
        /// <summary>
        /// 定义方法将输入转化为期望的事件(引发事件的方法)
        /// </summary>
        /// <param name="from"></param>
        /// <param name="to"></param>
        /// <param name="subject"></param>
        public void SimulateNewMail(string from, string to, string subject) {
            NewMailEventArgs e = new NewMailEventArgs(from, to, subject);
            OnNewMail(e);
        }
    }

订阅者类

View Code
    internal sealed class Pager
    {
        public Pager(MailManger mm)
        {
            mm.NewMail += new EventHandler<NewMailEventArgs>(mm_NewMail);
            
        }

        public void Unregister(MailManger mm)
        {
            mm.NewMail -= new EventHandler<NewMailEventArgs>(mm_NewMail);
        }

        void mm_NewMail(object sender, NewMailEventArgs e)
        {
            Console.WriteLine("Pager mail message:");
            Console.WriteLine("   From={0}, To={1}, Subject={2}",
               e.From, e.To, e.Subject);
        }
    }


    internal sealed class Fax
    {
        public Fax(MailManger mm) {
            mm.NewMail += new EventHandler<NewMailEventArgs>(mm_NewMail);     
           
        }

        void mm_NewMail(object sender, NewMailEventArgs e)
        {
            Console.WriteLine("Faxing mail message:");
            Console.WriteLine("   From={0}, To={1}, Subject={2}",
               e.From, e.To, e.Subject);
        }
    }

程序输出结果

4、博客园中其他资料

posted @ 2012-07-06 11:25  Ian.w  阅读(437)  评论(0)    收藏  举报