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;

三、在合適的時候觸發事件,事件委託會執行添加到事件委託的其他方法

訂閱者給出一個聯繫我的方法,然後註冊到事件委託中,觸發事件後事件委託調用訂閱者給出的聯繫方法


寫得不好的地方,請批評指正
[email protected]

注:本文中代碼示例來自《C#高級編程(第11版)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章