Microsoft 不遵循 UseGenericEventHandlersInstances FxCop 规则

Posted

技术标签:

【中文标题】Microsoft 不遵循 UseGenericEventHandlersInstances FxCop 规则【英文标题】:Microsoft doesn't follow UseGenericEventHandlersInstances FxCop rule 【发布时间】:2012-03-27 12:41:14 【问题描述】:

我目前正在通过我们已经开发了大约一年的应用程序运行 FxCop。

我不确定的一个规则是 UseGenericEventHandlersInstances。我了解如何实现它,但并没有真正看到好处,除了节省必须为每个自定义事件处理程序定义委托的步骤。在我们的例子中,我们已经创建了这些委托,我想知道我们是否对更改事件处理程序有任何好处,或者应该禁用此规则。

根据我有限的经验,几乎所有 FxCop 规则似乎都遵循 Microsoft 和 .NET 框架。但是,在这种情况下,情况并非如此。 .NET 框架使用我们使用过的传统方法,并声明委托,至少对于我研究过的所有鼠标和键盘事件处理程序而言。

没有人知道微软为什么做或不做某事,但这进一步让我质疑这条规则的有效性和好处。

【问题讨论】:

【参考方案1】:

您在 .NET BCL 的最新版本中看到的大多数非泛型委托都是在引入泛型之前创建的。将预先存在的事件更改为使用 EventHandler 将是一项重大更改,就像删除可能被其他代码使用的公共 ___EventHandler 委托一样。但是,对于 BCL 公开的新事件,有相当多的 EventHandler 使用,因此假设 Microsoft 不遵守新代码规则是不正确的。

在您的情况下,如果更改较旧的事件声明是一项重大更改或价值较低,您可以选择禁止现有的违反规则的行为。当然,即使对于新事件,您也可以选择忽略该规则,尽管我不确定为什么要这样做,因为遵循该规则实际上可以避免原始开发人员的不必要工作,同时增强 API 可用性。

【讨论】:

除了不必定义委托之外,真正的节省是什么?您仍然将事件绑定到特定的自定义 EventArgs 类,所以我看不到可用性收益。 您是否有 Microsoft 使用新的通用方法的示例事件?我什么都没看到。 少定义一个代表对作者来说是有点收获。不需要查看 YetAnotherEventHandler 所代表的内容是消费者的收获(可以说是更大的收获)。至于 BCL 中 EventHandler 的使用示例,有很多。我在 mscorlib 中找到的第一个公共是 System.AppDomain.FirstChanceException。

以上是关于Microsoft 不遵循 UseGenericEventHandlersInstances FxCop 规则的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft 的数据库命名约定?

遵循微软教程后 ASP .NET Cookie 太大

Microsoft ProjectOxford Vision API 错误

在 microsoft bot 框架上使用 webchat 获取 403 Forbidden

Hololens 2 和 Microsoft.MixedReality.QR 缺少方法异常

使用 Microsoft Media Foundation 从文件播放视频