为什么通用的EventHandler <targs>使用不足?</targs>

时间:2010-11-12 06:50:07

标签: c# events generics delegates

.NET 2.0添加了EventHandler<TArgs>通用委托类型,以简化编写自定义事件的过程;而不必定义EventArgs类及其相应的委托(例如MyEventArgsMyEventHandler),您只需要编写args类。

请记住,为什么这个委托类型在.NET Framework中几乎没有出现?我知道大多数核心API是在引入泛型之前开发的,但即使在像WPF这样的框架的新部分中,它们也选择明确定义委托类型;例如RoutedEventHandler代替EventHandler<RoutedEventArgs>

通用事件处理程序委托是否存在内在错误?我经常使用它,我担心与内置类相比,我的代码看起来很不合适。

4 个答案:

答案 0 :(得分:7)

只是历史事故。如果我们在.NET 1中使用泛型,那么其他大多数代表都不会存在。

答案 1 :(得分:5)

我认为它没有任何问题。 在框架的某些位置使用...在GeoCoordinateWatcher.Position事件中,就像一个随机的例子。

在代码中查看比RoutedEventHandler这样的特定类型名称更加笨拙 - 而且您将在WPF / Silverlight中使用RoutedEventHandler lot ,也许这就是为什么MS决定给它自己的类型。

答案 2 :(得分:2)

当您编写框架级代码时,您可能会更加明确。当您编写工具包和应用程序级代码时,情况并非如此。

答案 3 :(得分:1)

以下只是我个人的意见,但对我来说似乎(显然)是合理的; 如果我们仔细看看你如何使用.net和v studio,看起来通用类型符号似乎泄漏了一些“美”。

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

虽然上面的代码非常简单,直接且很好地支持智能感觉,EventHandler“外观和感觉”看起来并不清晰。默认的智能支持只会建议EventHandler,而不是它的泛型。此外,符号看起来很糟糕:

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



在查看代码时,您每次都会阅读“EventHandler”,并且您的思想可能会连接这些代表,因为您习惯用它们来识别类型之间的关系。

另一方面,也可能存在较少的同位素和更多技术/逻辑解释:
首先,您总是在处理方法中获得发送方对象。虽然这看起来很有用乍一看 - 这是大麦用过的 此外,你的论据必须来自EventArgs,由于现有组件的使用,它可能很烦人,有时甚至只是不可能。 除了典型的泛型(例如IList / List)之外,您可能会泄漏使用更抽象类型(如界面)或仅使用简单类型(如双精度)的可能性。
最后但并非最不重要的是微软引入的那些符号规则/建议 - 对于你的路由事件的例子,规则可能会说它的类型被“标记”为通过使其名称与“路由”这个词一起被路由。虽然该事件的命名本身表示该名称以“预览”开头。

正如我所说:这只是我的意见所以不要怪我;)