5

如果您查看只读集合的​​代码,它没有“添加”方法,而是定义了该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 }
}

只读集合类:

public class ReadOnlyCollection<T> : ICollection<T>
{
    void ICollection<T>.Add(T item) { //Throw Exception }
}

那么,这是误报吗?微软的基础代码不好吗?是什么赋予了?

4

3 回答 3

5

许多Microsoft 代码“失败”了 FxCop 和 StyleCop 。主要原因是这些工具是新的。很多 BCL 是由许多程序员编写的,而没有有任何 .NET 经验。

我会说在这种特殊情况下这是一个误报。但这取决于您所说的“虚假”是什么意思。我认为集合界面的运行时性质充其量只是做作。可以说只读集合违反了 LSP。但是显式实现充当“提示”,表明您的类并不是真正的(完整)集合。

于 2011-07-11T21:01:12.070 回答
1

这是一个误报。在只读集合中 anAdd永远不会有用。

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

在这种情况下,将其隐藏在视线之外是非常有意义的。

于 2011-07-11T21:06:14.083 回答
1

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

.NET Framework 中有一些通用的 ReadOnlyDictionary 实现,尽管它们在现有版本中都不是公共的。其中至少一个(System.Dynamic.Utils.ReadOnlyDictionary)对“修改”方法使用显式接口实现。

于 2011-07-12T12:09:16.377 回答