閱讀《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....