首页 > 其他分享 >事件详解

事件详解

时间:2023-01-17 22:01:17浏览次数:36  
标签:Console -- 详解 事件 WriteLine Lesson public

事件概念

    事件的本质其实也是委托,只不过加了event关键字

语法:

public event 委托名 事件名

注意:  定义事件时,一般要有一个委托类型,用这个委托类型来定义处理事件的方法类型。注:笔者会在本文中提供两个思路


事件--委托和事件有什么联系和区别?
事件是委托的实例--事件是特殊的委托;

都可以+=/-=;
既然有了多播委托,为什么又搞个事件呢?
a.安全--事件是只能在类的内部执行;
b.就算是类的子类也不能执行当前类中的事件,只能由自己来执行;
c.事件从外面操作,只能有一个+=/-=;

 

为什么要用事件?事件究竟能干什么?
事件(观察者模式)能把固定动作和可变动作分开,完成固定动作,把可变动作分离出去,由外部控制
搭建框架时,恰好就需要这个特点,可以通过事件去分离可变动作,支持扩展

控件事件:
启动Form---初始化控件Button---Click事件---+=一个动作

点击按钮--鼠标操作--操作系统收到信号--发送给程序--程序得接受信号,判断控件--登陆--
(事件只能类的内部发生) Button类自己调用Click--肯定是触发了Click事件---登陆动作就会执行

点击按钮--鼠标操作--操作系统收到信号--发送给程序--程序得接受信号,判断控件--支付--
(事件只能类的内部发生) Button类自己调用Click--肯定是触发了Click事件---支付动作就会执行

2次按钮操作,大部分东西都是一样的,就是具体业务不一样的,
封装的控件就完成了固定动作--接受信号&默认动作。。。
可变部分,就是事件---是一个开放的扩展接口,想扩展什么就添加什么
event限制权限,避免外部乱来。

 

观察者模式三要素

1.事件发布者
发布事件并且在满足条件时触发事件
2订户
关注事件,事件发生后,自己做出对应的动作
3.订阅
把事件发布者和订户关联起来

 

实现代码

方式一(为事件定义委托,用这个委托类型来定义处理事件的方法类型)

    /// <summary>
    /// 事件发布者,满足条件触发事件
    /// </summary>
    public class MyEventTest
    {
        //为事件定义一个委托
        public delegate void aEventHandler();
        //定义事件(aEventHandler是委托名称)
        public event aEventHandler eventRun;


        /// <summary>
        /// 触发事件的方法
        /// </summary>
        public void TestRun() 
        {
            //触发的事件
            eventRun.Invoke();
            //或者eventRun(); 建议使用Invoke,看的清晰一点


        }
    }

    /// <summary>
    /// 订户:关注事件,事件发生后,做出自己的动作
    /// </summary>
    public class RunEventTest 
    {

        /// <summary>
        /// 定义处理事件的方法
        /// </summary>
        public void Run() 
        {
            Console.WriteLine("事件开始处理了");
        }
    
    }

//上端调用
MyEventTest myTest = new MyEventTest();//实例化事件发布者
RunEventTest RunEventTest = new RunEventTest();//实例化订户

//订阅:把事件和订户关联起来
myTest.eventRun += new MyEventTest.aEventHandler(RunEventTest.Run);
myTest.TestRun();

 

 

方式二(为事件封装特定的参数类型)

    public class EventStandard
    {
        /// <summary>
        /// 订阅: 把订户和事件关联
        /// </summary>
        public static void Show()
        {
            Lesson lesson = new Lesson()
            {
                Id = 123,
                Name = "冬季长款羽绒服",
                Price = 2699
            };
            //订阅:把订户和发布者的事件关联起来
            lesson.IncreaseHandler += new YongHu().Buy;

            lesson.IncreaseHandler += new ShangHu().Popularize;
            lesson.Price = 3999;
        }

    }



    /// <summary>
    /// 订户:关注事件,事件发生后,自己做出对应的动作
    /// </summary>
    public class YongHu
    {
        public void Buy(object sender, EventArgs e)
        {
            Lesson lesson = (Lesson)sender;
            Console.WriteLine($"This is {lesson.Name} Lesson");

            XEventArgs args = (XEventArgs)e;
            Console.WriteLine($"之前价格{args.OldPrice}");
            Console.WriteLine($"现在价格{args.NewPrice}");
            Console.WriteLine("果断买了!!!");
        }
    }
    /// <summary>
    /// 订户2:关注事件,事件发生后,自己做出对应的动作
    /// </summary>
    public class ShangHu
    {
        public void Popularize(object sender, EventArgs e)
        {
            Lesson lesson = (Lesson)sender;
            Console.WriteLine($"This is {lesson.Name} Lesson");

            XEventArgs args = (XEventArgs)e;
            Console.WriteLine($"之前价格{args.OldPrice}");
            Console.WriteLine($"现在价格{args.NewPrice}");
            Console.WriteLine("广大用户请留意!!!");
        }
    }

    /// <summary>
    /// 事件参数,一般会为事件封装特定的参数
    /// </summary>
    public class XEventArgs : EventArgs
    {
        public int OldPrice { get; set; }
        public int NewPrice { get; set; }
    }


    /// <summary>
    /// 事件的发布者,发布事件并且在满足条件的时候,触发事件
    /// </summary>
    public class Lesson
    {
        public int Id { get; set; }
        public string Name { get; set; }

        private int _price;
        //价格发生变化触发事件
        public int Price
        {
            get
            {
                return this._price;
            }
            set
            {
                if (value > this._price)
                {
                    this.IncreaseHandler?.Invoke(this,
                        new XEventArgs()
                        {
                           // OldPrice = this._price,
                            //NewPrice = value
                            OldPrice=value,
                            NewPrice=this._price
                        });
                    this._price = value;
                }
            }
        }

        /// <summary>
        /// 打折事件
        /// 
        /// </summary>
        public event EventHandler IncreaseHandler;

    }


//上端调用
EventStandard.Show();

 

标签:Console,--,详解,事件,WriteLine,Lesson,public
From: https://www.cnblogs.com/JohnTang/p/17058776.html

相关文章

  • 初步理解:jvm运行机制,java程序运行机制,堆栈详解,jvm调优的目的。
    谷咕咕最近在准备面试,本来想多看看堆和栈的关系,看看发现又设计到gc(GarbageCollection)垃圾回收机制,发现盲区太多了,就去粗略的学习了一下jvm(java虚拟机),发现之前只会写程序,底......
  • os模块的使用方法详解
    os模块os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;即os模块提供了非常丰富的方法用来处理文件和目录。使用的时候需要导入该模块:importos常用方法如......
  • Flutter帧率监控 | 由浅入深,详解获取帧率的那些事
    前言做线上帧率监控上报时,少不了需要弄明白如何通过代码获取实时帧率的需求,这篇文章通过图解配合Flutter性能调试工具的方式一步步通俗易懂地让你明白获取帧率的基础知识,以......
  • linux命令详解
    万字详解Linux常用指令(值得收藏)运维网工 2023-01-0109:00 发表于重庆收录于合集#linux命令12个#linux11个#linux常用命令4个来源:https://blog.csdn.n......
  • Flutter帧率监控 | 由浅入深,详解获取帧率的那些事
    前言做线上帧率监控上报时,少不了需要弄明白如何通过代码获取实时帧率的需求,这篇文章通过图解配合Flutter性能调试工具的方式一步步通俗易懂地让你明白获取帧率的基础知识,......
  • 5. Pytest自定义前置后置:fixture参数详解(了解)
    一、前言我们上节课讲到fixture自定义前置函数的时候,有5个非必填参数,scope,params,autouse,ids,name。一般情况下这五个参数我们在工作中都不常用,但是个别情况会用到,这节......
  • 7. Pytest参数化:parametrize参数详解(了解)
    一、前言上节课我们讲解了如何用parametrize装饰器进行参数化,它有5个参数,argnames,argvalues,indirect,ids,scope,本节课针对这五个参数做详细讲解。二、学习目标1.a......
  • Target EDI 对接详解 1– Partner Online EDI 注册
    Target塔吉特是美国仅次于Walmart沃尔玛的第二大巨型折扣零售百货集团,在2020财年实现零售收入同比增长19.8%,赶超了CVS和Tesco,并在2020财年的销售额增长超过150亿美元......
  • Python之configparser模块详解和使用
    (目录)1configparser安装pip3installconfigparser2configparser简介用来读取配置文件的python包;一般做自动化测试的时候,会使用到这个模块,用来封装一些常量。比如......
  • JS逆向之补环境过瑞数详解
    JS逆向之补环境过瑞数详解“瑞数”是逆向路上的一座大山,是许多JS逆向者绕不开的一堵围墙,也是跳槽简历上的一个亮点,我们必须得在下次跳槽前攻克它!!好在现在网上有很多讲解......