2011-02-08 45 views
5

在我讀過的所有.NET書籍中,實現事件的指南都解釋說您需要子類EventArgs並使用EventHandler。我查了一下http://msdn.microsoft.com/en-us/library/ms229011.aspx的更多信息,它說:「請使用System.EventHandler,而不是手動創建新的委託來用作事件處理程序。」我明白使用EventArgs有很重要的理由,但我的問題不是「我應該這樣做嗎?」,而是「我可以這樣做嗎?」。EventArgs類和event關鍵字之間是否存在特殊關聯?

有沒有,我不能使用一個通用的委託,而不是EventHandler我的事件的原因嗎?例如,如果我想要一個強類型的發件人(任何人都會被那個object sender惱怒?)。

要解釋一下我的意思是更好的,是沒有任何理由下面就不行?

public class IoC 
{ 
    public AbstractFactory GetAbstractFactory() 
    { 
     var factory = new AbstractFactory(); 
     factory.CreateObject +=()=>new object(); 
     return factory; 
    } 
} 
public class AbstractFactory 
{ 
    public event Func<object> CreateObject; 

    private object OnObjectCreated() 
    { 
     if(CreateObject == null) 
     { 
      throw new Exception("Not injected."); 
     } 
     return CreateObject(); 
    } 


    private object _injectedObject; 
    public object InjectedObject 
    { 
     get 
     { 
      if(_injectedObject == null) 
      { 
       _injectedObject = OnObjectCreated(); 
      } 
      return _injectedObject; 
     } 
    } 
} 
+0

我已經完成了這個來實現類似於可觀察集合的東西。 – asawyer 2011-02-08 22:04:36

+0

相關話題:http://stackoverflow.com/questions/4828212/should-eventhandler-always-be-used-for-events/4828233返回 – CodesInChaos 2011-02-08 22:06:01

回答

5

這只是約定,並沒有語言的要求。您可以使用任何委託類型作爲事件。

標準EventHandler<T>簽名具有一些優勢,但:

  1. 可以擴展EventArgs參數。如果你想要傳遞給事件處理程序的每個事物都有一個參數,這將不起作用。
  2. 的事件處理程序,它接受了EventArgs基類可以訂閱任何事件公約
  3. 您可以添加擴展的方法來EventHandler<T>它出現在所有的事件之後。
  4. 返回類型是void。其他返回類型作爲事件處理程序沒有多大意義。
  5. 你在遵守約定。遵守約定通常是一個好主意,除非你有令人信服的論點。
3

來自Microsoft的所有文檔都是關於基類庫和/或通用框架設計準則的設計。你可以使用任何你想要的模式。

也就是說,如果人們將消耗你的代碼,它會如果按照微軟採用的模式是他們比較熟悉。

0

據我所知,事件處理程序和EventArgs的是最佳做法,但沒有什麼可以從一個事件的聲明中使用任意委託阻止你。 event關鍵字爲您提供了特殊的功能,可以將+ =和 - =委派給事件槽,而不僅僅是具有委託類型的字段或屬性,它只接受單個委託(除非您編寫多個委託你自己)。

警告:我不確定會發生什麼代表們在事件槽返回值。我的猜測是返回值被丟棄,因爲具有分配給事件的返回值的多個委託將難以處理。這需要一些實驗。

相關問題