zoukankan      html  css  js  c++  java
  • 事件[event]_C#

    事件(event):

    1.       事件是类在发生其关注的事情时用来提供通知的方式。例如,封装用户界面控件的类可以定义一个在单击该控件时发生的事件。控件类不关心单击按钮时发生了什么,但它需要告知派生类单击事件已发生。然后,派生类可选择如何响应。

    2.       事件发行者(Publisher):

    一个事件发行者,也称作发送者(sender),其实就是一个对象,这个对象会自行维护本身的状态信息。当本身状态信息变动时,便触发一个事件,并通知所有的事件订阅者。

    事件订阅者(Subscriber):

    对事件感兴趣的对象,也称为接收者(Receiver),可以注册感兴趣的事件,通常需提供一个事件处理程序,在事件发行者触发一个事件后,会自动执行这段代码的内容。

    3. 事件的四个步骤:

    ->①在事件发行者中定义一个事件

    ->②在事件发行者中触发事件

    ->③在事件订阅者中定义事件处理程序

    ->④向事件发行者订阅一个事件

    看一段代码:

    using System;

    //注意下面的四步骤!!!

    //事件订阅者

    class Subscriber   //订阅者

    {

        private string name;

        public Subscriber(string name)

        {

            this.name = name;

        }

        //③在事件订阅者中定义事件处理程序

        public void Receive(string manazineName) //***在事件订阅中定义事件处理程序

        {

            Console.WriteLine(name + "订阅已收到" + manazineName);

     

        }

    }

    //事件发布者

    class Publisher    //出版社

    {

        public delegate void PubComputer(string magazineName);   //声明事件所需的代理,也就是一委托类型

        public delegate void PubLife(string magazineName);

        //①在事件发行者中定义一个事件

        public event PubComputer OnPubComputer;   //事件的声明,也就是定义一个委托类型变量

        public event PubLife OnPubLife;

     

        public void issueComputer()              //***触发事件的方法

        {

            if (OnPubComputer != null)

            {

                Console.WriteLine("发行<<电脑>>杂志");

                //②在事件发行者中触发事件

                OnPubComputer("电脑杂志");       //***触发一个委托链

            }

        }

        public void issueLife()

        {

            if (OnPubLife != null)

            {

                Console.WriteLine("发行<<生活>>杂志");

                //②在事件发行者中触发事件

                OnPubLife("生活杂志");

            }

        }

    }

     

    class Story

    {

        static void Main()

        {

            Publisher Pub = new Publisher();

            Subscriber zs = new Subscriber("张三");

            Subscriber ls = new Subscriber("李四");

            //④向事件发行者订阅一个事件

            Pub.OnPubComputer += zs.Receive;          //***向事件发行者订阅一个事件

            Pub.OnPubComputer += ls.Receive;

            Pub.OnPubLife += ls.Receive ;

     

            Pub.issueComputer();   //触发事件

            Pub.issueLife();

            Console.WriteLine();

            Console.WriteLine("a year after");

            Pub.OnPubComputer -= ls.Receive;

            Pub.issueComputer();   //触发事件

            Pub.issueLife();

            Console.ReadLine();

        }

    }

    4.       NET Framework事件设计准则:

    ->事件的命名准则应使用PascalCasing命名方式

    ->声明delegate时,使用void类型当作返回值,EventName事件的事件委托是EventNameEventHandler,事件接受两个传入参数,一律命为sender与e.

    ->定义一个提供事件数据的类。对类以EventNameEventArgs进行命名,从System.EventArgs派生该类,然后添加所有事件特定的成员。

    public delegate void EventNameEventHandler(object sender, EventNameEventArgs e);

    ->下面的过程说明如何在类中实现事件。如果事件不提供任何数据,也要声明两参数,e参数可以直接使用系统的System.EventArgs类。 如果需要传递数据,则要从System.EventArgs继承一个类, 并把数据放在里面。

    public delegate void EventNameEventHandler(object sender , EventArgs e);

    public event EventNameEventHandler EventName;

    ->在引发事件的类中提供一个受保护的方法。以OnEventName进行命名。在该方法中引发该事件:

          protected virtual void OnEventName(EventArgs e)

    {

    If ( EventName != null )

    {

     EventName(this, e );

    }

    下面规范化一下上面的代码:

    using System;

    //注意下面的四步骤!!!

    //事件订阅者

    class Subscriber   //订阅者

    {

        private string name;

        public Subscriber(string name)

        {

            this.name = name;

        }

        //③在事件订阅者中定义事件处理程序

        public void Receive(object sender,PubEventArgs e) //***在事件订阅中定义事件处理程序

        {

            Console.WriteLine(e.pubDate +" " +name+ "订阅已收到" + e.magazineName );

     

        }

    }

    //事件发布者

    class PubEventArgs : EventArgs    //提供数据的类

    {

        private readonly string _magazineName;

        private readonly DateTime _pubDate;

        public PubEventArgs(string magazineName, DateTime pubDate)

        {

            _magazineName = magazineName;

            _pubDate = pubDate;

        }

        public string magazineName

        {

            get { return _magazineName; }

        }

        public DateTime pubDate

        {

            get { return _pubDate; }

        }

    }

    class Publisher    //出版社

    {

        public delegate void PubComputerEventHandler(object sender,PubEventArgs e);   //声明事件所需的代理,也就是一委托类型

        public delegate void PubLifeEventHandler(object sender, PubEventArgs e);

        //①在事件发行者中定义一个事件

        public event PubComputerEventHandler PubComputer;   //事件的声明,也就是定义一个委托类型变量

        public event PubLifeEventHandler PubLife;

     

        protected virtual void OnPubComputer(PubEventArgs e)

        {

            PubComputerEventHandler handler = PubComputer;

            if (handler != null)

            {

                handler(this, e);

            }

        }

        protected virtual void OnPubLife(PubEventArgs e)

        {

            PubLifeEventHandler handler = PubLife;

            if (handler != null)

            {

                handler(this, e);

            }

        }

     

        public void issueComputer(string magazineName, DateTime pubDate)              //***触发事件的方法

        {

            Console.WriteLine("发行" + magazineName);

            //②在事件发行者中触发事件

            OnPubComputer(new PubEventArgs(magazineName, pubDate));

     

        }

        public void issueLife(string magazineName, DateTime pubDate)              //***触发事件的方法

        {

            Console.WriteLine("发行" + magazineName);

            //②在事件发行者中触发事件

            OnPubLife(new PubEventArgs(magazineName, pubDate));

     

        }

    }

     

    class Story

    {

        static void Main()

        {

            Publisher Pub = new Publisher();

            Subscriber zs = new Subscriber("张三");

            Subscriber ls = new Subscriber("李四");

            //④向事件发行者订阅一个事件

            Pub.PubComputer += zs.Receive;          //***向事件发行者订阅一个事件

            Pub.PubComputer += ls.Receive;

            Pub.PubLife += ls.Receive;

     

            Pub.issueComputer("电脑杂志",Convert.ToDateTime ("2006-1-1"));   //触发事件

            Pub.issueLife("生活杂志", Convert.ToDateTime("2006-1-1"));

            Console.WriteLine();

            Console.WriteLine("a year after");

            Pub.PubComputer -= ls.Receive;

            Pub.issueComputer("电脑杂志", Convert.ToDateTime("2007-1-1"));   //触发事件

            Pub.issueLife("生活杂志", Convert.ToDateTime("2007-1-1"));

            Console.ReadLine();

        }

    }

  • 相关阅读:
    D. Constructing the Array
    B. Navigation System
    B. Dreamoon Likes Sequences
    A. Linova and Kingdom
    G. Special Permutation
    B. Xenia and Colorful Gems
    Firetrucks Are Red
    java getInstance()的使用
    java 静态代理和动态代理
    java 类加载机制和反射机制
  • 原文地址:https://www.cnblogs.com/0515offer/p/4191920.html
Copyright © 2011-2022 走看看