C 中關於EventHandler使用的一些理解

2021-07-23 16:23:08 字數 2366 閱讀 1222

閱讀《c# 高階程式設計》,其中關於eventhandler的使用頗讓人費解。

因為已經習慣了public event delegatename eventname;這種定義事件的方式,因此下面結合這種方式來解釋一下書中示例的**。

先來看看cardealer類的定義:

public class carinfoeventargs : eventargs

public string car

} public class cardealer

", car);

raisenewcarinfo(car);

}protected virtual void raisenewcarinfo(string car)

}}

這裡實際上先定義了乙個繼承自eventargs的類,這個類的作用是用來儲存將用來傳遞給事件的引數,在本例中,就是string成員car,表示新車的名字。

然後在cardealer類中,定義了事件newcarinfo,型別是eventhandler,這是eventhanlder的泛型。eventhandler表示乙個接受兩個引數(object sender, teventargs e),返回型別為void的方法。其中,teventargs必須為派生自eventargs類的型別。後乙個引數就是儲存事件所需要引數用的。

然後是兩個方法,其中raisenewcarinfo方法就是執行事件的方法。該方法由newcar方法呼叫,接受string引數。而newcar方法開放給汽車銷售商,每到一輛新車,就執行一次這個方法,執行需要把新車的名字傳遞給方法。

然後我們來看客戶consumer類:

public class consumer

public void newcarishere(object sender, carinfoeventargs e)

: car is new", name, e.car);

}}

客戶類定義了字段name用來儲存客戶名,這個name會在newcarishere方法中使用到。重點就是這個newcarishere方法,觀察可知,它的簽名符合eventhandler型別:返回型別為void,接受乙個object引數和乙個carinfoeventargs引數。這就是event事件可以接受的方法。

因此在main類中執行的方法就很簡單了:

var dealer = new cardealer();

var michael = new consumer("michael");

dealer.newcarinfo += michael.newcarishere;

dealer.newcar("ferrari");

var nick = new consumer("sebastian");

dealer.newcarinfo += nick.newcarishere;

dealer.newcar("mercedes");

dealer.newcarinfo -= michael.newcarishere;

dealer.newcar("red bull racing");

將不同consumer例項中的newcarishere方法加入newcarinfo事件,於是在每次銷售商執行newcar方法時,兩個客戶都會得到通知。

其實,以上可以寫成:

public class newcardealer

", name);

if (newcarevent!=null)}}

public class newconsumer

public void newcarishere(string carname)

: car is new", name, carname);

}}

然後在main方法中執行以下**:

var dealer = new newcardealer();

var michael = new newconsumer("michael");

dealer.newcarevent += michael.newcarishere;

dealer.newcar("ferrari");

var nick = new newconsumer("sebastian");

dealer.newcarevent += nick.newcarishere;

dealer.newcar("mercedes");

dealer.newcarevent -= michael.newcarishere;

dealer.newcar("red bull racing");

可以得到一樣的效果。

C 中關於 解析

表示作用域和所屬關係 關於 的具體解析 是運算子中等級最高的,它分為三種 1 global scope 全域性作用域符 用法 name 2 class scope 類作用域符 用法 class name 3 namespace scope 命名空間作用域符 用法 namespace name 都是左...

C 中關於this指標

在學習完c語言之後,很大的感覺就是指標是貫穿c語言的核心,但是接觸到c 後,發現很多都是封裝好的,直接用就可以。其中有一塊問題就是,通過函式去呼叫類的成員,上好像是直接訪問的,但是又有很多問題,為啥這個類裡面的函式可以直接訪問這個類裡面的成員呢?這就是我們需要關注的this指標。首先來看下面這段 c...

關於C 中timer類

關於c 中timer類 在c 裡關於定時器類就有3個 1.定義在system.windows.forms裡 2.定義在system.threading.timer類裡 3.定義在system.timers.timer類裡 例 使用system.timers.timer類 system.timers....