CA2227 со словарем, что за исправление? - PullRequest
3 голосов
/ 31 января 2012
public Dictionary<string, string> Data { get; set; }

С приведенной выше строкой кода я получаю ошибку полицейского стиля, свойства коллекции CA2227 должны быть доступны только для чтения.

Есть ли какой-нибудь способ, чтобы я мог преодолеть эту ошибку, не добавляя подавление Stylecop илинеобходимость создать свой собственный класс словаря только для чтения?

Ответы [ 5 ]

7 голосов
/ 31 января 2012

Похоже, вам просто нужно удалить ключевое слово "set".Примерно так:

private readonly Dictionary<string, string> data = new Dictionary<string, string>();

public Dictionary<string, string> Data { get { return this.data; } }

Часто вам не нужно переназначать коллекцию, а вместо этого можно просто очистить существующую.Я полагаю, откуда это предупреждение.Приведенный выше пример - подход, который я использую большую часть времени.

3 голосов
/ 31 января 2012

Не уверен, но следующее может устранить ошибку:

public Dictionary<string, string> Data { get; private set; }

Если честно, глупо мешать вашему развитию из-за чьей-то субъективной идеи стиля (также известной как StyleCop и FxCop).

2 голосов
/ 31 января 2012

Я не думаю, что CA2227 просит вас предоставить только для чтения Dictionary<,>.Скорее StyleCop жалуется, что вы можете установить словарь напрямую.Вы должны удалить сеттер и / или сделать его закрытым, чтобы избавиться от предупреждения.Кроме того, ваш класс может предоставить свои собственные методы Add и Clear.Подробнее см. http://msdn.microsoft.com/en-us/library/ms182327%28VS.80%29.aspx.

2 голосов
/ 31 января 2012

Это предупреждение анализа кода (ранее называвшееся FxCop), а не StyleCop. И это CA2227, а не CA1227.

См. эту статью MSDN , которая довольно ясно говорит о проблеме.

Попробуйте следующее ( private setter), чтобы исправить это:

public Dictionary<string, string> Data { get; private set; }
0 голосов
/ 05 декабря 2012

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

myThing.Items = GetItems();

И разработчик исправляет это:

var items = GetItems();

foreach (var item in items)
{
    myThing.Items.Add(item);
}

Представьте, что GetItems () возвращает коллекцию из миллиона элементов. Как это может быть хорошо? Я нахожу заявление Microsoft: «Не исключайте предупреждение из этого правила». в MSDN быть немного сильным!

...