2011-03-23 37 views
0


的問題,我想知道:兩個關於事件

  1. 認購類的名稱,對於事件的訂閱或也正在處理事件的方法?我的意思是說,「訂閱事件的方法」是否有意義?

  2. 在MSDN上它說事件委託應該只有2個參數。不確定這是什麼意思,因爲我經常使用自定義代理創建事件,例如沒有一個或一個參數。

回答

4

1)是的,談論訂閱某個事件的方法絕對有意義。實際上,你可以認爲這是涉及三個實體:

  • 的訂閱代碼的實際執行申購本身
  • 事件出版商
  • 處理器這所預訂;這往往是 - 但並不總是 - 在同一類代碼訂閱代碼

2)你當然可以創建使用委託與任意數量的參數事件。 約定是事件中使用的代表有兩個參數:從「EventArgs」派生的「發件人」和「參數」。例如,這意味着您可以按照約定從簽署void Foo(object sender, EventArgs e)任意事件的方法訂閱處理程序。

+0

@PietroC:你的意思是「訂戶」(而不是「訂閱」?)。你有特定的鏈接嗎?這不是我第一次看到MSDN使用混淆術語。 – 2011-03-23 14:58:20

+0

http://msdn.microsoft.com/en-us/library/awbftdfh.aspx。它說:發送(或引發)事件的類稱爲發佈者,接收(或處理)事件的類稱爲訂閱者。 – PietroC 2011-03-23 15:01:17

+0

@PietroC:我認爲參考方法(或匿名函數)並將它們稱爲* handlers *可以更清晰。否則它會讓代碼「執行訂閱」變得混亂。 (C#規範事件概述 - 第1.6.7.4節 - 將它們稱爲處理程序。) – 2011-03-23 15:04:30

0

訂閱者是作爲事件處理程序添加的方法。

標準做法是使用EventHandler<T>委託進行事件;這有兩個論點。
但是,您可以使用任意數量的參數創建自己的事件。

0

我會專注於第二點。正如Jon指出的那樣,您可以使用自己的代表進行事件。但你很少應該。即使你不關心公約,看它是這樣的:當你用你自己的事件與自定義的代表,你有除了事件本身領域下面的代碼:

  • 您的自定義委託
  • 事件處理程序(相匹配的簽名方法) - 有時他們中的很多
  • 事件調用點(在你需要傳遞的所有參數) - 有時他們中的很多
  • 我也傾向於創造InvokeMyEvent方法那是做的需要檢查無效和其他的東西做

你必須改變所有這些,如果您決定添加或刪除參數或更改參數類型。

現在,如果你創建自己的類繼承EventArgs或使用EventArgs<T>,您有:

  • CustomEventArgs
  • 事件處理程序
  • 事件調用點
  • InvokeMyEvent方法。

當你決定改變事件參數你只有改變您的自定義的args類和事件調用點的一些。 「一些」,因爲您可以爲您的參數類的字段提供合適的默認值,並只在需要時提供這些值。

大多數好的/不好的練習會談都集中在一件事 - 易於改變。變化總是發生。你做的事情越少越好,越好。設計有很多迭代,很可能你必須改變你的接口和類型。每當你決定不再需要參數時,你不想改變數十個簽名。所以請使用EventArgsEventArgs<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,你可以使用一個全用於這樣的事情的專用方法。如果沒有,那麼你最終會有數十個。