• 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、博客园中其他资料

  • 相关阅读:
    高德地图API之公交路线
    高德地图API之骑行路线
    高德地图API之货车路线
    高德地图API之步行路线
    高德地图API之驾车路线
    高德地图API常用控件的添加与删除(鹰眼、工具条、比例尺)
    高德地图API,地图类型切换(卫星地图)
    高德地图API之缩放比例尺控件+3D转换
    Laravel 虚拟开发环境 Homestead 密码
    优化mysql
  • 原文地址:https://www.cnblogs.com/whx1973/p/Event.html
Copyright © 2020-2023  润新知