2012-03-11 44 views
5

海報在Are EventArg classes needed now that we have genericsDoes .NET have a built-in EventArgs<T>?建議對通用EventArgs,至少這是我的感覺。內置類型的通用EventArgs

當我需要的是一種內置類型時,是否有理由使用它?在我的具體情況下,我正在通過TCP讀取數據流,並在收到數據時通知訂戶。

public event EventHandler<EventArgs<string>> data_received = delegate { }; 

... 

while (!reader.EndOfStream) 
{ 
    if ((data = reader.ReadLine()) != "") 
    { 
     this.data_received(this, new EventArgs<string>(data)); 
    } 
} 

或者也許一個事件不是傳遞數據給訂閱者的最好方法?

回答

5

簡答:取決於。

你可以考慮EventArgs<T>類如Tuple<T>用於傳遞和返回方法的數據。在一些簡單的情況下和內部使用Tuple<T>是適當的,但對於更復雜的情況或公共表面,使用單獨的類型會更合適。

隨着EventArgs<T>我們有或多或少相同的困境。對於內部使用它確定使用這種類型,但對於公共API它可能導致維護噩夢。

在您的特定情況下,它看起來不錯乍一看使用EventArgs<T>,但如果以後你會決定一些額外的信息添加到這個甚至像EndPoint?在這種情況下,您可以使用EventArgs<T, U>(如Tuple<T, U>),或者您可以切換到自定義EventArgs類。在這兩種情況下,你會打破所有的客戶,如果你只有一個客戶端的代碼 - 它的好,但如果沒有...

底線,內部的東西它可以使用EventArgs,但公共面I建議使用自定義事件參數。

P.S.事件的一般命名約定是CamelCase,在您的特殊情況下,這意味着DataReceived更適合您的活動。