事件是基於委託的概念,委託基本上是一個方法簽名的定義。就這樣。就像在一個界面中你如何定義方法簽名一樣,但是你沒有實現它們,你可以在所有繼承該接口的類中這樣做。
委託是一個方法簽名的定義,以及您可以定義爲許多方法身體是你喜歡的,例如,鑑於這一委託(方法簽名的定義):
public delegate void ChangingHandler (object sender, CarArgs ca);
您可以定義與此委託(方法簽名的定義),因爲這些機構:
public void SomeMethodWhichCreatesADelegateBody()
{
ChangingHandler myChangingHandler = new ChangingHandler(
delegate(object sender, EventArgs e) { /* the method body for myChangingHandler */ }
);
}
這雖然定義爲代表的老風格,現在它更具可讀性,而不是使用委託關鍵字的lambda表達式像我一樣創建方法體,但這對於這些並不重要 問題。
現在可以將事件想象成一個委託(方法簽名定義),其中包含一個body數組,用於訂閱事件,訂閱方法體的語法爲+=
,還有用於從事件的訂閱是-=
所以這裏這個代碼定義身體爲ChangingHandler委託陣列(方法簽名的定義)去除的方法體:
public event ChangingHandler Change;
而且你可以訂閱身體的(它們添加到數組)通過calli進行分組NG的方法:
public void SomeMethodWhichSubscribesADelegateBodyToAnEvent()
{
ChangingHandler myChangingHandler = new ChangingHandler(
delegate(object sender, EventArgs e) { /* the method body for myChangingHandler */ }
);
Change += myChangingHandler;
}
現在的全部理由進行這項活動,有法人體的,只要你想,你去定義和添加的數組,就是這樣,每當一個事件發生在物體內部誰擁有該事件,該對象可以執行所有這些方法,以便在該事件發生時執行您想要完成的任何操作。擁有該對象的對象的確如此:
if (Change != null) // You wouldn't access an array without making sure it wasn't null, would you?
{
Change(this, new CarArgs()); // This executes every method body in it's array using the signature definition the delegate defined.
// The delegate simply exists so this code knows the method signature
// so it can know how to call those method body's for you.
}
請注意,您不需要顯式創建委託實例。你可以做'car.Change + = car_Change;'(這非常習慣) – bruceboughton 2010-08-23 15:00:11