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

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

上一篇:NVM 安装( Windows)


下一篇:C#中使用JsonConvert解析JSON