zoukankan      html  css  js  c++  java
  • 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、博客园中其他资料

  • 相关阅读:
    7.21 高博教育 数组 内存
    【基础扎实】Python操作Excel三模块
    PAT 甲级 1012 The Best Rank
    PAT 甲级 1011  World Cup Betting
    PAT 甲级 1010 Radix
    链式线性表——实验及提升训练
    循环程序设计能力自测
    链表应用能力自测
    PAT 甲级 1009 Product of Polynomials
    1008 Elevator (20分)
  • 原文地址:https://www.cnblogs.com/whx1973/p/Event.html
Copyright © 2011-2022 走看看