2010-11-12 17 views
10

.NET 2.0增加了EventHandler<TArgs>通用委託類型來簡化編寫自定義事件的過程;而不必定義一個EventArgs類及其相應的委託(例如MyEventArgsMyEventHandler),您只需編寫args類。請記住,爲什麼這種委託類型在.NET Framework中幾乎沒有出現?我知道大多數核心API是在泛型引入之前開發的,但即使在像WPF這樣的框架的新部分,他們也選擇明確定義委託類型;例如RoutedEventHandler而不是EventHandler<RoutedEventArgs>爲什麼通用EventHandler <TArgs>如此不足?

通用事件處理程序委託是否存在內在錯誤?我經常使用它,並擔心與內置類相比,我的代碼顯得非常不合適。

+0

我懷疑引進事件處理程序的''只是時機不對。在它被引入的時候,另一種模式(明確命名的代表)已經確立,並開始向通用代表類型轉變,可能會被視爲造成更大的混亂(通過導致困惑的程序員問 - 「那是什麼委託再次調用?'FooEventHandler'或'EventHandler '?「_) - 這讓我很好奇,是否會轉向'IEvent '(由F#和Rx框架引入)。 – stakx 2010-11-12 06:58:47

+3

WPF於2003年7月開始,在仿製藥發佈之前。當然,Windows窗體也是如此。 – 2010-11-12 14:54:29

回答

7

只是一個歷史事故。如果我們在.NET 1中有泛型,那麼大多數其他代表將不存在。

5

我不認爲它有什麼問題。它的在框架的一些地方使用...在GeoCoordinateWatcher.Position事件中,就像一個隨機的例子。

這是一個有點笨拙看到代碼不是像RoutedEventHandler特定類型的名字 - 和你要使用RoutedEventHandler一個很多在WPF/Silverlight的,也許這就是爲什麼MS決定給它自己的類型。

2

也可能是,當你編寫框架級代碼時,你往往更加明確。當你編寫工具包和應用程序級代碼不是這樣的。

1

以下是我個人的看法,但對我來說似乎(顯然)是合理的; 如果我們仔細研究如何使用.net和v studio工作,看起來泛型類型符號似乎泄漏了一些「美」。

List<string> lst = new List<string>(); 
lst.Add("hello world"); 

雖然上面的代碼非常簡單,通過INTELLI意義上的事件處理程序的「外觀和感覺」犯規似乎是明確的直截了當和很好的支持。默認的智能支持只會提示EventHandler,而不是通用的。此外,該符號只是看起來awfull:

private event EventHandler<MyClass> SomeEvent; 
private event EventHandler<AnotehrClass> OtherEvent; 
privete event EventHandler<MoreClass> MoreEvents; 



雖然overviewing的代碼,你會讀「事件處理程序」每次和你的想法可能會連接這些代表,怎麼一回事,因爲你正在使用他們的名字,以確定類型的關係。

另一方面,也可能有一個更低技術含量和更技術/邏輯的解釋:
首先,你總是在處理方法中得到一個發件人對象。雖然這初看起來似乎有用 - 這是大麥使用過的。
此外,您的論據必須從EventArgs中派生出來,這可能會令人討厭,有時甚至因使用現有組件而不可避免。
除了典型的泛型(例如IList/List)之外,你有可能使用更抽象的類型(比如接口)或者只是簡單的類型(比如double)。
最後但並非最不重要的是microsoft引入了那些符號規則/建議 - 對於路由事件的例子,規則可能會說它的類型是「標記的」,因爲它的名字盯着單詞「路由」。雖然事件本身的名稱表示名稱以「預覽」開始。

正如我提到的:這只是我的意見,所以不要怪我;)

+0

'sender'參數絕對有其用途。只要你有相同的處理程序綁定到多個對象上的事件,它就會自動進入。雖然它一直沒有用,但使用你的代碼的人希望它可用。至於使用'EventArgs'的後代,我個人認爲這會促進在你的代碼和用戶之間建立一個門的想法 - 確保你不會意外地給它們一個你不希望它們修改的可變對象等等。不過,您關於命名的評論絕對有效。讓我希望C#有'typedef' ... – 2010-11-12 10:45:25