Что такое коллекция только для чтения? - PullRequest
20 голосов
/ 21 апреля 2010

Я запустил аналитик кода безопасности, у меня обнаружилось предупреждение CA2105 . Я посмотрел на пример подделки оценки. Я не знал, что вы можете назначить int [] только для чтения. Я думал, что readonly похож на const в C ++ и делает его незаконным.

Как исправить нарушения предлагают мне клонировать объект (что я не хочу делать) или «Заменить массив строго типизированной коллекцией, которую нельзя изменить». Я щелкнул ссылку и увидел «ArrayList» и добавил каждый элемент один за другим, и не похоже, что вы можете помешать добавлению чего-либо еще.

Итак, когда у меня есть этот фрагмент кода, какой самый простой или лучший способ сделать его доступным только для чтения?

public static readonly string[] example = { "a", "b", "sfsdg", "sdgfhf", "erfdgf", "last one"};

Ответы [ 6 ]

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

Самый простой способ иметь коллекцию, которую вы не можете изменить, это использовать

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);
11 голосов
/ 21 апреля 2010
public static readonly ReadOnlyCollection<string> example
    = new ReadOnlyCollection<string>(new string[] { "your", "options", "here" });

(хотя, вероятно, он все еще должен отображаться как свойство get, а не как открытое поле)

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

Если вы работаете с массивами, вы можете использовать

return Array.AsReadOnly(example);

чтобы обернуть ваш массив в коллекцию только для чтения.

3 голосов
/ 21 апреля 2010
var readOnly = new ReadOnlyCollection<string>(example);
1 голос
/ 21 февраля 2013

Я искал подобное решение, но я все еще хотел иметь возможность изменять коллекцию внутри класса, поэтому я выбрал опцию, описанную здесь: 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(); }
    }
}
1 голос
/ 21 апреля 2010
ReadOnlyCollection<string> readOnlyCollection = 
            new ReadOnlyCollection<string>(example);
...