• 事件[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();

        }

    }

  • 相关阅读:
    负载均衡之加权轮询算法(转)
    go 指南学习笔记
    select限制之文件描述符限制
    select的限制
    select实现超时(套接字IO超时设置)
    如何在CentOS 8上安装Puppet
    如何在Ubuntu 20.04 / 18.04或更老版本中安装ifconfig
    关于Ubuntu的Apt安装与使用介绍
    如何在CentOS 8上安装Suricata?
    如何在Ubuntu 20.04上安装PHP Composer
  • 原文地址:https://www.cnblogs.com/0515offer/p/4191920.html
Copyright © 2020-2023  润新知