代码分析规则 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
) 包含 add
和 remove
访问器。如果实现者选择使用“类字段事件”,则这两个访问器可以是“隐式”的。它是否仅适用于索引器,即IMyInterface
的唯一成员是string this[int idx] get;
?
这是 BCL 中的一个接口,它只包含一个事件(当然还有 add
和 remove
访问器):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:避免空接口,抱怨非空接口的主要内容,如果未能解决你的问题,请参考以下文章