Что такое только чтение?

Я запустил анализатор кода безопасности, я обнаружил, что предупреждение 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(); }
    }
}