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: CA1033 -微软的ReadOnlyCollection实现违反了这一点

一大堆的微软代码"失败" FxCop和StyleCop。主要原因是这些工具都是新工具;许多BCL是在任何人都没有任何。net经验之前由许多程序员编写的。

我想说,在这种特殊情况下,这是一个假阳性。但这取决于你对"假"的定义。我认为集合接口的运行时特性充其量是骗人的。有人认为只读收集违反了LSP。但是,显式实现充当了一个"提示",即您的类不是真正的(完整)集合。

这里是假阳性。在只读集合中,Add 永远不会是有用的。

它只需要满足接口,因为没有有效的/内置的只读IList[<T>]等价物提供通过索引的读访问。

在这种情况下,把它藏在视线之外是很有意义的。

我同意Marc在这一点上的看法——它是无用的,所以最好尽可能地隐藏它。同样值得考虑的是,ReadOnlyCollection可能出于完全相同的原因有类似的抑制。不幸的是,考虑到mscorlib的发布版本不包含SuppressMessage属性,我们没有简单的方法知道是否可能是这种情况。

在。net框架中有一些通用的ReadOnlyDictionary实现,尽管它们在现有版本中都不是公开的。它们中至少有一个(System.Dynamic.Utils.ReadOnlyDictionary)使用显式接口实现"修改"方法。