FxCop CA2227 предупреждение и ReadOnlyCollection <T> - PullRequest
1 голос
/ 30 апреля 2010

В моем проекте VS2008 SP1, .NET 3.5 SP1 у меня есть разные классы, которые содержат разные свойства. Я часто использую свойства авто C # 3.0.

Некоторые из этих свойств должны быть коллекциями. Поскольку я хочу сделать это проще, я использую ReadOnlyCollection<T> для этих свойств.

Я не хочу использовать IEnumerable<T>, так как мне нужен произвольный доступ к элементам.

Я использую Code Analysis (правила FxCop) и получаю предупреждение CA2227.

Я не понимаю, почему ReadOnlyCollection<T> должен иметь метод set, а его нельзя изменить ... Метод set может делать только то, что может делать свойство.

Пример:

using System.Collections.ObjectModel;

namespace CA2227
{
    public class MyClass
    {
        public ReadOnlyCollection<int> SomeNumbers { get; set; }
    }
}

CA2227: Microsoft.Usage: Измените «MyClass.SomeNumbers» только для чтения, удалив установщик свойств. C: \ Users ... \ Visual Studio 2008 \ Projects \ CA2227 \ MyClass.cs 7 CA2227

Ответы [ 3 ]

2 голосов
/ 30 апреля 2010

A ReadOnlyCollection нельзя изменить, но нет причины, по которой свойство с установщиком типа ReadOnlyCollection не может быть изменено для ссылки на другой ReadOnlyCollection. Если вы хотите, чтобы свойство SomeNumbers было неизменным, то оно должно быть как доступного только для чтения, так и иметь закрытый установщик.

EDIT

Если вы убеждены в том, что хотите, то, хотя FxCop правильно предупредит вас, вы довольны предупреждением. Если вы хотите избавиться от него, включите в этот момент атрибут SuppressMessage - если вы также определите константу CODE_ANALYSIS в свойствах проекта перед сборкой, FxCop будет учитывать этот атрибут и просто не будет выдавать это конкретное предупреждение этот конкретный случай.

1 голос
/ 30 апреля 2010

Довольно странно блокировать изменения содержимого коллекции, не блокируя также изменения самой коллекции. Если вы хотите иметь возможность устанавливать коллекцию из своего класса, сохраняя при этом использование автоматических свойств, вы можете использовать частный установщик. e.g.:

public ReadOnlyCollection<int> SomeNumbers { get; private set; }
0 голосов
/ 16 ноября 2013

Рассмотрите возможность использования

public class MyClass
{
    public IReadOnlyList<int> SomeNumbers { get; set; }
}

ReadOnlyCollection = http://msdn.microsoft.com/en-us/library/ms132474(v=vs.110).aspx

IReadOnlyList = http://msdn.microsoft.com/en-us/library/hh192385(v=vs.110).aspx

Проблема с ReadOnlyCollection заключается в том, что он по-прежнему наследуется от ICollection и имеет .Add, хотя в документации сказано, что он выдаст

...