FxCop: CA1033 -微软的ReadOnlyCollection实现违反了这一点
本文关键字:这一点 实现 ReadOnlyCollection CA1033 微软的 FxCop | 更新日期: 2023-09-27 18:01:51
如果查看只读集合的代码,它没有"Add"方法,而是定义了ICollection<T>.Add(T Value)
方法(显式接口实现)。
当我对ReadOnlyDictionary类做类似的事情时,FxCop 10抱怨我破坏了CA1033。
public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
//CA1033 ERROR
void IDictionary<TKey, TValue>.Add(TKey, TValue) { //Throw Exception }
}
public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
//NO CA1033 ERROR
Add(TKey, TValue) { //Throw Exception }
}
ReadOnlyCollectionClass:
public class ReadOnlyCollection<T> : ICollection<T>
{
void ICollection<T>.Add(T item) { //Throw Exception }
}
那么,这是假阳性吗?微软的基础代码不好吗?到底发生了什么事?
一大堆的微软代码"失败" FxCop和StyleCop。主要原因是这些工具都是新工具;许多BCL是在任何人都没有任何。net经验之前由许多程序员编写的。
我想说,在这种特殊情况下,这是一个假阳性。但这取决于你对"假"的定义。我认为集合接口的运行时特性充其量是骗人的。有人认为只读收集违反了LSP。但是,显式实现充当了一个"提示",即您的类不是真正的(完整)集合。
这里是假阳性。在只读集合中,Add
永远不会是有用的。
它只需要满足接口,因为没有有效的/内置的只读IList[<T>]
等价物提供通过索引的读访问。
在这种情况下,把它藏在视线之外是很有意义的。
我同意Marc在这一点上的看法——它是无用的,所以最好尽可能地隐藏它。同样值得考虑的是,ReadOnlyCollection可能出于完全相同的原因有类似的抑制。不幸的是,考虑到mscorlib的发布版本不包含SuppressMessage属性,我们没有简单的方法知道是否可能是这种情况。
在。net框架中有一些通用的ReadOnlyDictionary实现,尽管它们在现有版本中都不是公开的。它们中至少有一个(System.Dynamic.Utils.ReadOnlyDictionary)使用显式接口实现"修改"方法。