2013-04-02 48 views
0

在事件聲明中,是否使用泛型DataEventArgs<TData>類而不是聲明和使用自定義EventArgs繼承類,這違反了.Net事件「模式」約定?或者在某些情況下認爲不好的做法?好的,使用DataEventArgs <TData>而不是定製的事件數據類?

(該命名約定命名事件參數是使用事件名稱和追加後綴爲「EventArgs的」使用DataEventArgs<TData>省略了事件名稱,但它表明你發送的數據的類型。)

你也許可以爭辯說,通用的DataEventArgs類對擴展是封閉的,比如添加另一個屬性,除非你可以修改你用於TData的類。


更詳細的解釋:

當聲明,其中包括一些數據我明白,標準事件「模式」的約定是使用通用EventHandler委託正是如此宣佈其標準的代表事件:

public event EventHandler<SomethingHappendEventArgs> SomethingHappend; 

其中具體的SomethingHappendEventArgs被宣佈沿線

public class SomethingHappendEventArgs : EventArgs 
{ 
    public SomeDataType Value { get; private set; } 
    public SomethingHappendEventArgs(SomeDataType data) 
    { 
     this.Value = data; 
    } 
} 

當用谷歌搜索時,我注意到有幾個Microsoft命名空間提供了一個通用的DataEventArgs類(包括Microsoft.Practices.Prism.Events)。然而,我無處找到任何建議或約定指示何時使用它,而不是像SomethingHappendEventArgs這樣的自定義事件數據類,反之亦然。

所以,只要有一個一塊的數據,我想在事件數據包括,在那裏,我應該使用自定義的事件數據類,像SomethingHappendEventArgs,而不是宣佈這樣的事件的任何原因?

public event EventHandler<DataEventArgs<SomeDataType>> SomethingHappend; 

其中通用DataEventArgs可以像這樣聲明:

public class DataEventArgs<TData> : EventArgs 
{ 
    public TData Value { get; private set; } 
    public DataEventArgs(TData value) 
    { 
     this.Value = value; 
    } 
} 
+0

除了@妮可的指針有一些事情要考慮列在這個答案:http://stackoverflow.com/questions/129453/net-eventhandlers-generic-or-no/129613#129613 –

回答

4

有什麼理由不使用非公共事件的通用EventArgs的子類。但是,對於屬於真正的公共API的事件,由於潛在的向後兼容性問題,事情會變得棘手。對於公開使用的事件,創建特定於事件的EventArgs子類將使您可以靈活地添加成員,而不會影響API使用者。

對於不屬於公共API的事件,如果EventArgs子類因某個特定事件發生更改,仍然會有一些潛在的返工,因爲泛型子類不再適合。但是,這通常應該是相當小的,編譯器應該能夠捕獲任何問題(不管是使用顯式還是匿名處理程序方法)。顯然,在最初的開發工作和潛在的改變之間要做一個平衡 - fwiw,我用一個通用的EventArgs來進行內部事件,這很適合,而且我很少需要在初始化之後改變它發佈。

相關問題