zoukankan      html  css  js  c++  java
  • C#中事件流程的简单理解

    C#中事件流程的简单理解

    C#中事件基于委托,要理解事件要先理解委托,但是现在我还没想好怎么写委托,如果不懂委托可以先找找委托的文章

    事件基于委托,为委托提供了一种发布/订阅机制

    一上来就是这句话,很容易就懵了,我们先不管这句话,直接看例子

    public class CarInfoEventArgs : EventArgs
    {
        public CarInfoEventArgs(string car) => Car = car;
    
        public string Car { get; }
    }
    

    首先我们定义了一个类CarInfoEventArgs继承自EventArgs类,定义了一个构造函数和一个只读属性,其实这个类是不重要的

    我们看下一个类

    public class CarDealer
    {
        public event EventHandler<CarInfoEventArgs> NewCarInfo;
    
        public void NewCar(string car)
        {
            Console.WriteLine($"CarDealer, new car {car}");
    
            NewCarInfo?.Invoke(this, new CarInfoEventArgs(car));
        }
    }
    

    在这个类中,使用event关键字定义了NewCarInfo事件

    事件基于委托,NewCarInfo事件也是NewCarInfo委托,是EventHandler<T>类型的委托实例

    然后定义了一个NewCar方法,调用NewCar时当NewCarInfo不为null时触发事件NewCarInfo

    我当时在这里卡了很久,为什么是NewCarInfo?.Invoke(this, new CarInfoEventArgs(car))触发事件,其实是我蠢了,NewCarInfo.Invoke(this, new CarInfoEventArgs(car))NewCarInfo(this, new CarInfoEventArgs(car))完全相同,学委托的时候忘了这一点,导致Invoke半天不知道什么意思

    下面再定义一个Consumer类

    public class Consumer
    {
        private string _name;
    
        public Consumer(string name) => _name = name;
    
        public void NewCarIsHere(object sender, CarInfoEventArgs e) =>
            Console.WriteLine($"{_name}: car {e.Car} is new");
    }
    

    Consumer类定义了一个方法NewCarIsHere这个方法的作用我们也不细说,接下来看重点

    static void Main()
    {
        var dealer = new CarDealer();
        var valtteri = new Consumer("Valtteri");
        var max = new Consumer("Max");
        
        dealer.NewCarInfo += valtteri.NewCarIsHere;
        dealer.NewCarInfo += max.NewCarIsHere;
    
        dealer.NewCar("Williams");
        dealer.NewCar("Mercedes");
    
        dealer.NewCarInfo -= valtteri.NewCarIsHere;
    
        dealer.NewCar("Ferrari");
    }
    

    在Main方法中声明了两个Consumer类的实例valtterimax

    声明了一个CarDealer类的实例dealer

    从上面CarDealer类的定义我们知道,dealer有一个NewCarInfo的委托,有一个NewCar的方法

    dealer.NewCarInfo += valtteri.NewCarIsHere;
    dealer.NewCarInfo += max.NewCarIsHere;
    

    这两行代码为dealerNewCarInfo委托添加了两个方法引用,即调用NewCarInfo委托时会执行这两个方法,这就是发布/订阅机制中的订阅

    当调用dealer.NewCar方法时,就会触发NewCarInfo事件/委托,然后就会执行valtteri.NewCarIsHeremax.NewCarIsHere方法


    我整理了一下,大概流程就是这个样子:

    一、有一个类创建了一个事件,定义了触发事件的方法(CarDealer

    二、其他方法添加到事件委托中

    dealer.NewCarInfo += valtteri.NewCarIsHere;
    dealer.NewCarInfo += max.NewCarIsHere;
    

    三、在合适的时候触发事件,事件委托会执行添加到事件委托的其他方法

    订阅者给出一个联系我的方法,然后注册到事件委托中,触发事件后事件委托调用订阅者给出的联系方法


    写得不好的地方,请批评指正

    wujuncheng10@163.com

    注:本文中代码示例来自《C#高级编程(第11版)

  • 相关阅读:
    ASP.NET Core的配置信息
    ASP .NET Core 建立列表和表单View
    ASP.NET Core 如何使用Mvc相关技术建立Controller、Tag Helper (下)
    MySQL日志突然暴涨
    MySQL函数索引及优化
    MySQL统计库表大小
    MySQL8.0窗口函数实践及小结
    MySQL按指定字符合并及拆分
    分享2个近期遇到的MySQL数据库的BUG案例
    mysql大表在不停机的情况下增加字段该怎么处理
  • 原文地址:https://www.cnblogs.com/wujuncheng/p/12664466.html
Copyright © 2011-2022 走看看