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
类的实例valtteri
和max
声明了一个CarDealer
类的实例dealer
从上面CarDealer
类的定义我们知道,dealer
有一个NewCarInfo
的委托,有一个NewCar
的方法
dealer.NewCarInfo += valtteri.NewCarIsHere;
dealer.NewCarInfo += max.NewCarIsHere;
这两行代码为dealer
的NewCarInfo
委托添加了两个方法引用,即调用NewCarInfo
委托时会执行这两个方法,这就是发布/订阅机制中的订阅
当调用dealer.NewCar
方法时,就会触发NewCarInfo
事件/委托,然后就会执行valtteri.NewCarIsHere
和max.NewCarIsHere
方法
我整理了一下,大概流程就是这个样子:
一、有一个类创建了一个事件,定义了触发事件的方法(CarDealer
)
二、其他方法添加到事件委托中
dealer.NewCarInfo += valtteri.NewCarIsHere;
dealer.NewCarInfo += max.NewCarIsHere;
三、在合适的时候触发事件,事件委托会执行添加到事件委托的其他方法
订阅者给出一个联系我的方法,然后注册到事件委托中,触发事件后事件委托调用订阅者给出的联系方法
写得不好的地方,请批评指正
wujuncheng10@163.com
注:本文中代码示例来自《C#高级编程(第11版)