Что такое только чтение?
Я запустил анализатор кода безопасности, я обнаружил, что предупреждение CA2105. Я посмотрел на пример подделывания оценки. Я не понял, что вы можете назначить int [] для readonly int. Я думал, что readonly похож на С++ const и делает его незаконным.
Как исправить нарушения предлагает мне клонировать объект (который я не хочу делать) или "Заменить массив с помощью строго типизированной коллекции, которая не может быть изменена". Я щелкнул ссылку и посмотрел "ArrayList" и добавил каждый элемент один за другим, и это не похоже на то, что вы можете предотвратить добавление большего количества.
Итак, когда у меня есть этот фрагмент кода, что является самым простым или лучшим способом сделать его только для чтения?
public static readonly string[] example = { "a", "b", "sfsdg", "sdgfhf", "erfdgf", "last one"};
Ответы
Ответ 1
Самый простой способ иметь коллекцию, которую вы не можете изменить, - это использовать
ReadOnlyCollection
Пример из MSDN:
List<string> dinosaurs = new List<string>();
dinosaurs.Add("Tyrannosaurus");
dinosaurs.Add("Amargasaurus");
dinosaurs.Add("Deinonychus");
dinosaurs.Add("Compsognathus");
ReadOnlyCollection<string> readOnlyDinosaurs = new ReadOnlyCollection<string>(dinosaurs);
Ответ 2
public static readonly ReadOnlyCollection<string> example
= new ReadOnlyCollection<string>(new string[] { "your", "options", "here" });
(хотя он все равно должен быть показан как свойство get
, а не публичное поле)
Ответ 3
Если вы работаете с массивами, вы можете использовать
return Array.AsReadOnly(example);
чтобы обернуть ваш массив в коллекцию только для чтения.
Ответ 4
var readOnly = new ReadOnlyCollection<string>(example);
Ответ 5
ReadOnlyCollection<string> readOnlyCollection =
new ReadOnlyCollection<string>(example);
Ответ 6
Я искал аналогичное решение, но мне захотелось по-прежнему модифицировать коллекцию внутри класса, поэтому я выбрал вариант, описанный здесь:
http://www.csharp-examples.net/readonly-collection/
Короче говоря, его пример:
public class MyClass
{
private List<int> _items = new List<int>();
public IList<int> Items
{
get { return _items.AsReadOnly(); }
}
}