Является ли ReadOnlyCollection <char>неизменным? - PullRequest
4 голосов
/ 21 апреля 2010

С кодом ниже я получаю предупреждение CA2104 (DoNotDeclareReadOnlyMutableReferenceTypes)

public readonly ReadOnlyCollection<char> IllegalChars;

с частью сообщения об ошибке

изменить поле на то, которое является неизменяемый ссылочный тип. Если тип ссылки «ReadOnlyCollection» находится в Факт, неизменный, исключить это сообщение.

Я уверен, что ReadOnlyCollection является неизменяемым, но мой вопрос: есть ли тип, который я могу использовать, чтобы это сообщение не появлялось?

Ответы [ 2 ]

4 голосов
/ 21 апреля 2010

Вы можете переписать открытое поле в свойство:

public ReadOnlyCollection<char> IllegalChars { get; private set; }

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

2 голосов
/ 14 февраля 2016

Я уверен, что ReadOnlyCollection неизменна.

Она неизменна в том смысле, что вы не можете изменить какую коллекцию она переносит, или изменить эту коллекцию через нее.

Он не является неизменным в том смысле, что, поскольку ReadOnlyCollection является оберткой, его можно изменить, изменив базовую коллекцию:

var list = new List<char>{ 'a', 'b', 'c' };
var ro = new ReadOnlyCollection<char>(list);
list.Add('d');
Console.WriteLine(string.Join(",", ro)); // a,b,c,d

Однако у вас наверняка может быть ReadOnlyCollection, который является неизменным на практикеиз-за отсутствия ссылки на базовую коллекцию в любом месте (самый простой способ - скопировать ее при создании или создать эту коллекцию только при первом создании обертки только для чтения, а затем не иметь другой ссылки).

Это будет сделаноозначает, что вы придерживаетесь духа CA2104, поскольку вы не защищены от проблем, от которых он призван вас спасти.Тогда было бы разумно подавить предупреждение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...