Список <T>только для чтения с приватным набором - PullRequest
50 голосов
/ 20 января 2011

Как я могу выставить List<T> так, чтобы он был доступен только для чтения, но мог быть установлен в частном порядке?

Это не работает:

public List<string> myList {readonly get; private set; }

Даже если вы делаете:

public List<string> myList {get; private set; }

Вы все еще можете сделать это:

myList.Add("TEST"); //This should not be allowed

Я думаю, вы могли бы иметь:

public List<string> myList {get{ return otherList;}}
private List<string> otherList {get;set;}

Ответы [ 15 ]

94 голосов
/ 20 января 2011

Я думаю, что вы смешиваете понятия.

public List<string> myList {get; private set;}

является уже «только для чтения». То есть за пределами этого класса ничто не может установить myList для другого экземпляра List<string>

Однако, если вам нужен список только для чтения, например, «Я не хочу, чтобы люди могли изменять список содержимое », то вам необходимо предоставить ReadOnlyCollection<string>. Вы можете сделать это через:

private List<string> actualList = new List<string>();
public ReadOnlyCollection<string> myList
{
  get{ return actualList.AsReadOnly();}
}

Обратите внимание, что в первом фрагменте кода другие могут манипулировать списком, но не могут изменить список, который у вас есть. Во втором фрагменте другие получат список только для чтения, который они не смогут изменить.

11 голосов
/ 20 января 2011

Я предпочитаю использовать IEnumerable

private readonly List<string> _list = new List<string>();

public IEnumerable<string> Values // Adding is not allowed - only iteration
{
   get { return _list; }
}
11 голосов
/ 20 января 2011

Если вы хотите, чтобы коллекция только для чтения использовалась ReadOnlyCollection<T>, а не List<T>:

public ReadOnlyCollection<string> MyList { get; private set; }
10 голосов
/ 20 января 2011

Возвращает коллекцию ReadOnlyCollection, которая реализует IList <>

private List<string> myList;

public IList<string> MyList
{
  get{return myList.AsReadOnly();}
}
4 голосов
/ 20 января 2011
private List<string> my_list;

public ReadOnlyCollection<string> myList
{
    get { return my_list.AsReadOnly(); }
    private set { my_list = value; }
}
4 голосов
/ 20 января 2011

Вы можете использовать метод ListReReOOnly () для возврата оболочки только для чтения.

4 голосов
/ 20 января 2011

Есть коллекция под названием ReadOnlyCollection<T> - это то, что вы ищете?

3 голосов
/ 14 ноября 2012

В платформе .NET 4.5 вы можете предоставить только интерфейс IReadOnlyList . Что-то вроде:

private List<string> _mylist;
public IReadOnlyList<string> myList { get {return _myList;} }

или если вы хотите предотвратить нежелательное приведение к IList

private List<string> _mylist;
public IReadOnlyList<string> myList { get {return new List<string>(_myList);} }
3 голосов
/ 20 января 2011

Вот один из способов

public class MyClass
    {
        private List<string> _myList;
        public ReadOnlyCollection<string> PublicReadOnlyList { get { return _myList.AsReadOnly(); } }

        public MyClass()
        {
            _myList = new List<string>();
            _myList.Add("tesT");
            _myList.Add("tesT1");
            _myList.Add("tesT2");

            //(_myList.AsReadOnly() as List<string>).Add("test 5");
        }

    }
3 голосов
/ 20 января 2011
    private List<string> _items = new List<string>();         

    public ReadOnlyCollection<string> Items

    {

        get { return _items.AsReadOnly(); }

        private set { _items = value }

    }
...