如果查看只读集合的代码,它没有“添加”方法,而是定义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 }
}
那么,这是假阳性吗?微软的基本代码是坏的吗?是什么给了什么?
答案 0 :(得分:5)
Microsoft代码 lot “失败”FxCop和StyleCop。主要原因是这些工具是新的;很多BCL都是由许多程序员在任何人完全没有.NET经验之前编写的。
我会说在这个特殊情况下这是误报。但这取决于你所说的“假”。我认为集合界面的运行时性质最好。可以认为只读集合违反了LSP。但是显式实现充当了“提示”,即您的类不是真正(完整)集合。
答案 1 :(得分:1)
这是假阳性。在只读集合中,Add
永远不会有用。
只需要满足接口,因为没有有效/内置的只读IList[<T>]
等效,它通过索引提供读访问。
在这种情况下,将它放在视线之外是完全合理的。
答案 2 :(得分:1)
我在这个问题上与Marc达成一致 - 它没用,所以最好尽可能隐藏它。同样值得考虑的是,ReadOnlyCollection可能具有类似的抑制,原因完全相同。不幸的是,鉴于mscorlib的发布版本不包含SuppressMessage属性,我们没有简单的方法来了解是否可能出现这种情况。
.NET Framework中有一些通用的ReadOnlyDictionary实现,尽管它们在现有版本中都不公开。其中至少有一个(System.Dynamic.Utils.ReadOnlyDictionary)使用显式接口实现“修改”方法。