FxCop: CA1033 - Реализация Microsoft ReadOnlyCollection нарушает это?

Если вы посмотрите на код для коллекции только для чтения, у него нет метода "Добавить", а вместо этого определяется 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 }
}

Итак, это ложный положительный результат? Базовый код Microsoft плох? Что дает?

3 ответа

Решение

Большая часть кода Microsoft "терпит неудачу" FxCop и StyleCop. Основная причина в том, что эти инструменты являются новыми; большая часть BCL была написана многими программистами еще до того, как кто-либо имел опыт работы с.NET.

Я бы сказал, что в данном конкретном случае это ложный положительный результат. Но это зависит от того, что вы подразумеваете под "ложным". Я думаю, что во время исполнения интерфейс коллекции в лучшем случае хокирует. Можно утверждать, что коллекции только для чтения нарушают LSP. Но явная реализация действует как "намек", что ваш класс на самом деле не является (полной) коллекцией.

Это ложный позитив здесь. В коллекции только для чтения Add никогда не будет полезным.

Это нужно только для удовлетворения интерфейса, так как нет действительного / встроенного только для чтения IList[<T>] эквивалент, который обеспечивает доступ для чтения по индексу.

В этом случае спрятать его с глаз долой имеет смысл.

Я согласен с Марком в этом вопросе - он бесполезен, так что он может быть настолько скрыт, насколько это возможно. Также стоит учесть, что ReadOnlyCollection может иметь аналогичное подавление по той же причине. К сожалению, учитывая, что сборка выпуска mscorlib не содержит атрибутов SuppressMessage, у нас нет простого способа узнать, так ли это на самом деле или нет.

В.NET Framework есть несколько общих реализаций ReadOnlyDictionary, хотя ни одна из них не является общедоступной в существующих версиях. По крайней мере один из них (System.Dynamic.Utils.ReadOnlyDictionary) использует явные реализации интерфейса для методов "модификации".

Другие вопросы по тегам