代码分析规则 CA1040:避免空接口,抱怨非空接口

Posted

技术标签:

【中文标题】代码分析规则 CA1040:避免空接口,抱怨非空接口【英文标题】:Code analysis rule CA1040: Avoid empty interfaces, complains on a non empty interface 【发布时间】:2013-03-11 12:05:48 【问题描述】:

我有一个声明事件的接口

interface IMyInterface

event SomeHandler MyEvent1;
event SomeHandler MyEvent2;
...

但是当我启用代码分析规则CA1040:避免空接口时,它抱怨我的接口违反了这个规则,有什么解决办法吗?

【问题讨论】:

只是抑制警告?这显然是虚假的。 我更喜欢仅在有真正原因时才禁止,在这种情况下,原因是规则无法正常工作 奇怪,如果它认为接口是空的。 event 声明是实现类/结构必须具有 en event 的要求,该类型 (SomeHandler) 包含 addremove 访问器。如果实现者选择使用“类字段事件”,则这两个访问器可以是“隐式”的。它是否仅适用于索引器,即IMyInterface 的唯一成员是string this[int idx] get; 这是 BCL 中的一个接口,它只包含一个事件(当然还有 addremove 访问器):INotifyCollectionChanged Interface 我无法使用上面的代码在 VS 2010 中重现,即使在公开接口之后(通常这是触发 CA1040 所必需的)。您能否提供一个实际导致 CA1040 违规的完整示例(包括 SomeHandler 的定义)? 【参考方案1】:

之所以抱怨,是因为这个接口不需要任何实现。 您不能以任何特定方式实现事件声明。

正如马修建议的那样,压制它。你可能需要在你的班级顶部添加这个:

#define CODE_ANALYSIS

或者抑制被忽略。

编辑

毕竟这可能是一个错误,因为实际上需要任何继承接口的类来“实现”它 - 因此:它不是一个空接口。

【讨论】:

你说“这个接口不需要任何实现”——但是class Foo : IMyInterface 编译失败! tuche - 确实如此。这有点令人惊讶,因为这些事件只能有一个实现。编辑我的答案。 不仅仅是事件的一种实现:可能是event SomeHandler MyEvent1;,或event SomeHandler Event1 add ... remove ... 【参考方案2】:

请参阅这篇文章。它描述了如何使用SuppressMessageAttribute。 Visual Studio 提供了一个方便的菜单来添加这个属性: http://msdn.microsoft.com/en-us/library/ms182069.aspx

【讨论】:

以上是关于代码分析规则 CA1040:避免空接口,抱怨非空接口的主要内容,如果未能解决你的问题,请参考以下文章

当'IN list'为空和非空列表时避免查询重复

VS代码分析CA1062即使在空检查后也会触发

使用链式构造函数避免代码分析 CA2000 警告?

代码分析规则 CA1062 行为

使用接口在非空数组(切片)中查找另一个“特殊”数组

约束索引三范式