• 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版)

  • 相关阅读:
    我的公众号 猫和大叔(maohedashu)
    centos编译php时出现make: *** [sapi/fpm/phpfpm] Error 1
    如何在centos和linux等主机上安装 pstree
    如何在centos下卸载干净nginx
    监控感悟(一)
    ant design vue 获取上传图片的像素
    ant vue中atree默认展开指定的树节点不起作用
    uniapp中组件属性设置不生效的解决方案
    vue+canvas实现简易画板
    ant design vue级联选择懒加载省市区三级数据
  • 原文地址:https://www.cnblogs.com/wujuncheng/p/12664466.html
Copyright © 2020-2023  润新知