你真的懂c#中的事件吗?

一、事件是什么

事件一共有两个角色:发布者、订阅者。

流程:

1.定义好发布者,定义好发布后要干的事。

  2.订阅者开始订阅。

3.发布事件:凡是订阅了的,就会收到事件的通知,进行相关处理操作。


二、事件的本质

事件的本质是委托链。

代码1:自定义 委托类型实现事件


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{

    //红包出现类,充当时间发布者
    public class RedPaperPerson
    {
        //自定义委托
        public delegate void RedPaperHandler();

        //使用自定义委托类型定义事件,事件命名为MarryEvent
        public event RedPaperHandler RedPaperEvent;

        //发出时间
        public void SendRedPaper(string msg)
        {
            //输出信息
            Console.WriteLine(msg);

            //判断是否绑定了事件处理方法
            if (RedPaperEvent != null)
            {
                //触发事件
                RedPaperEvent();
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //初始化红包对象
            RedPaperPerson redpaperperson = new RedPaperPerson();

            //实例化抢红包的人
            Person person1 = new Person("小韩");
            Person person2 = new Person("小日");
            Person person3 = new Person("小菲");

            //订阅事件
            //活生生的委托链定义(RedPaperEvent:委托对象,new RedPaperPerson.RedPaperHandler(person1.SendMessage):实例化委托)
            redpaperperson.RedPaperEvent += new RedPaperPerson.RedPaperHandler(person1.SendMessage);
            redpaperperson.RedPaperEvent += new RedPaperPerson.RedPaperHandler(person2.SendMessage);

            //发红包了,此时只有订阅了事件的对象才能收到红包通知,去抢
            redpaperperson.SendRedPaper("低调的发了个红包");
            Console.WriteLine("---------------------------");

            //取消订阅事件
            redpaperperson.RedPaperEvent -= new RedPaperPerson.RedPaperHandler(person2.SendMessage);

            //订阅事件
            redpaperperson.RedPaperEvent += new RedPaperPerson.RedPaperHandler(person3.SendMessage);

            //再发一个红包
            redpaperperson.SendRedPaper("低调的发了个红包");
            Console.Read();


        }
    }

    class Person
    {
        //字段
        public string Name;

        //构造函数
        public Person(string name)
        {
            Name = name;
        }

        //事件处理函数,该函数需要符合RedPaperHandler委托的定义
        public void SendMessage()
        {

            //对事件作出处理
            Console.WriteLine(this.Name + "哈哈,已经抢到红包");
        }
    }
}


代码2:EventHandler实现事件


    //红包出现类,充当时间发布者
    public class RedPaperPerson
    {

        //使用自定义委托类型定义事件,事件命名为MarryEvent
        public event EventHandler RedPaperEvent;

        //发出时间
        public void SendRedPaper(string msg)
        {
            //输出信息
            Console.WriteLine(msg);

            //判断是否绑定了事件处理方法
            if (RedPaperEvent != null)
            {
                //触发事件
                RedPaperEvent(this, new EventArgs());
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //初始化红包对象
            RedPaperPerson redpaperperson = new RedPaperPerson();

            //实例化抢红包的人
            Person person1 = new Person("小韩");
            Person person2 = new Person("小日");
            Person person3 = new Person("小菲");

            //订阅事件
            //活生生的委托链定义(RedPaperEvent:委托对象,new RedPaperPerson.RedPaperHandler(person1.SendMessage):实例化委托)
            redpaperperson.RedPaperEvent += new EventHandler(person1.SendMessage);
            redpaperperson.RedPaperEvent += new EventHandler(person2.SendMessage);

            //发红包了,此时只有订阅了事件的对象才能收到红包通知,去抢
            redpaperperson.SendRedPaper("低调的发了个红包");
            Console.WriteLine("---------------------------");

            //取消订阅事件
            redpaperperson.RedPaperEvent -= new EventHandler(person2.SendMessage);

            //订阅事件
            redpaperperson.RedPaperEvent += new EventHandler(person3.SendMessage);

            //再发一个红包
            redpaperperson.SendRedPaper("低调的发了个红包");
            Console.Read();


        }
    }

    class Person
    {
        //字段
        public string Name;

        //构造函数
        public Person(string name)
        {
            Name = name;
        }

        //事件处理函数,该函数需要符合RedPaperHandler委托的定义
        public void SendMessage(object s, EventArgs e)
        {

            //对事件作出处理
            Console.WriteLine(this.Name + "哈哈,已经抢到红包");
        }
    }



三、扩展EventArgs类实现:处理事件中的参数

代码3:事件传参数


    //自定义事件类,并使其带有事件数据
    public class RedPaperEventArgs : EventArgs
    {
        public string Message;
        public RedPaperEventArgs(string msg)
        {
            Message = msg;
        }
    }

    //红包出现类,充当时间发布者
    public class RedPaperPerson
    {
        public delegate void EventHandler(object sender, RedPaperEventArgs e);

        //使用自定义委托类型定义事件,事件命名为MarryEvent
        public event EventHandler RedPaperEvent;

        //发出事件
        public void SendRedPaper(string msg)
        {


            //判断是否绑定了事件处理方法
            if (RedPaperEvent != null)
            {
                //触发事件
                RedPaperEvent(this, new RedPaperEventArgs(msg));
            }
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            //初始化红包对象
            RedPaperPerson redpaperperson = new RedPaperPerson();

            //实例化抢红包的人
            Person person1 = new Person("小韩");
            Person person2 = new Person("小日");
            Person person3 = new Person("小菲");

            //订阅事件
            //活生生的委托链定义(RedPaperEvent:委托对象,new RedPaperPerson.RedPaperHandler(person1.SendMessage):实例化委托)
            redpaperperson.RedPaperEvent += new RedPaperPerson.EventHandler(person1.SendMessage);
            redpaperperson.RedPaperEvent += new RedPaperPerson.EventHandler(person2.SendMessage);

            //发红包了,此时只有订阅了事件的对象才能收到红包通知,去抢
            redpaperperson.SendRedPaper("低调的发了个红包");
            Console.WriteLine("---------------------------");

            //取消订阅事件
            redpaperperson.RedPaperEvent -= new RedPaperPerson.EventHandler(person2.SendMessage);

            //订阅事件
            redpaperperson.RedPaperEvent += new RedPaperPerson.EventHandler(person3.SendMessage);

            //再发一个红包
            redpaperperson.SendRedPaper("低调的发了个红包");
            Console.Read();

        }
    }

    class Person
    {
        //字段
        public string Name;

        //构造函数
        public Person(string name)
        {
            Name = name;
        }

        //事件处理函数,该函数需要符合RedPaperHandler委托的定义
        public void SendMessage(object s, RedPaperEventArgs e)
        {
            //输出信息
            Console.WriteLine(e.Message);
            //对事件作出处理
            Console.WriteLine(this.Name + "哈哈,已经抢到红包");
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若云流风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值