FxCop: CA1033 - Реализация Microsoft ReadOnlyCollection нарушает это? - PullRequest
5 голосов
/ 12 июля 2011

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

* * 1010

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

Ответы [ 3 ]

5 голосов
/ 12 июля 2011

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

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

1 голос
/ 12 июля 2011

Я согласен с Марком в этом вопросе - он бесполезен, поэтому он может быть настолько скрыт, насколько это возможно.Также стоит учесть, что ReadOnlyCollection может иметь аналогичное подавление по той же причине.К сожалению, учитывая, что сборка выпуска mscorlib не содержит атрибутов SuppressMessage, у нас нет простого способа узнать, может ли это быть так.хотя ни один из них не является публичным в существующих версиях.По крайней мере один из них (System.Dynamic.Utils.ReadOnlyDictionary) использует явные реализации интерфейса для методов "модификации".

1 голос
/ 12 июля 2011

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

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

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

...