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;
三、在合適的時候觸發事件,事件委託會執行添加到事件委託的其他方法
訂閱者給出一個聯繫我的方法,然後註冊到事件委託中,觸發事件後事件委託調用訂閱者給出的聯繫方法
寫得不好的地方,請批評指正
[email protected]
注:本文中代碼示例來自《C#高級編程(第11版)