的問題,我想知道:兩個關於事件
認購類的名稱,對於事件的訂閱或也正在處理事件的方法?我的意思是說,「訂閱事件的方法」是否有意義?
在MSDN上它說事件委託應該只有2個參數。不確定這是什麼意思,因爲我經常使用自定義代理創建事件,例如沒有一個或一個參數。
的問題,我想知道:兩個關於事件
認購類的名稱,對於事件的訂閱或也正在處理事件的方法?我的意思是說,「訂閱事件的方法」是否有意義?
在MSDN上它說事件委託應該只有2個參數。不確定這是什麼意思,因爲我經常使用自定義代理創建事件,例如沒有一個或一個參數。
1)是的,談論訂閱某個事件的方法絕對有意義。實際上,你可以認爲這是涉及三個實體:
2)你當然可以創建使用委託與任意數量的參數事件。 約定是事件中使用的代表有兩個參數:從「EventArgs
」派生的「發件人」和「參數」。例如,這意味着您可以按照約定從簽署void Foo(object sender, EventArgs e)
到任意事件的方法訂閱處理程序。
訂閱者是作爲事件處理程序添加的方法。
標準做法是使用EventHandler<T>
委託進行事件;這有兩個論點。
但是,您可以使用任意數量的參數創建自己的事件。
我會專注於第二點。正如Jon指出的那樣,您可以使用自己的代表進行事件。但你很少應該。即使你不關心公約,看它是這樣的:當你用你自己的事件與自定義的代表,你有除了事件本身領域下面的代碼:
InvokeMyEvent
方法那是做的需要檢查無效和其他的東西做你必須改變所有這些,如果您決定添加或刪除參數或更改參數類型。
現在,如果你創建自己的類繼承EventArgs
或使用EventArgs<T>
,您有:
CustomEventArgs
類InvokeMyEvent
方法。當你決定改變事件參數你有只有改變您的自定義的args類和事件調用點的一些。 「一些」,因爲您可以爲您的參數類的字段提供合適的默認值,並只在需要時提供這些值。
大多數好的/不好的練習會談都集中在一件事 - 易於改變。變化總是發生。你做的事情越少越好,越好。設計有很多迭代,很可能你必須改變你的接口和類型。每當你決定不再需要參數時,你不想改變數十個簽名。所以請使用EventArgs
或EventArgs<T>
,並節省一些頭痛。
另一個小一點是,你可能會想聲明一些方法照顧撫養事件,就像這樣:
public static public void FireEvent<T>(this EventHandler handler, object sender, EventArgs<T> e)
where T : EventArgs
{
if (handler != null)
handler(sender, e);
}
如果所有的事件都是基於EventHandler
,你可以使用一個全用於這樣的事情的專用方法。如果沒有,那麼你最終會有數十個。
@PietroC:你的意思是「訂戶」(而不是「訂閱」?)。你有特定的鏈接嗎?這不是我第一次看到MSDN使用混淆術語。 – 2011-03-23 14:58:20
http://msdn.microsoft.com/en-us/library/awbftdfh.aspx。它說:發送(或引發)事件的類稱爲發佈者,接收(或處理)事件的類稱爲訂閱者。 – PietroC 2011-03-23 15:01:17
@PietroC:我認爲參考方法(或匿名函數)並將它們稱爲* handlers *可以更清晰。否則它會讓代碼「執行訂閱」變得混亂。 (C#規範事件概述 - 第1.6.7.4節 - 將它們稱爲處理程序。) – 2011-03-23 15:04:30