Список <T> readonly с частным набором
Как я могу открыть 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;}
Ответы
Ответ 1
Я думаю, что вы смешиваете понятия.
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();}
}
Обратите внимание, что в первом фрагменте кода другие могут манипулировать списком, но не могут изменить список. Во втором фрагменте другие получат список только для чтения, который они не могут изменить.
Ответ 2
Если вы хотите использовать только для чтения, используйте ReadOnlyCollection<T>
, а не List<T>
:
public ReadOnlyCollection<string> MyList { get; private set; }
Ответ 3
Я предпочитаю использовать IEnumerable
private readonly List<string> _list = new List<string>();
public IEnumerable<string> Values // Adding is not allowed - only iteration
{
get { return _list; }
}
Ответ 4
Возвращает ReadOnlyCollection, который реализует IList < >
private List<string> myList;
public IList<string> MyList
{
get{return myList.AsReadOnly();}
}
Ответ 5
Там коллекция под названием ReadOnlyCollection<T>
- это то, что вы ищете?
Ответ 6
Вы можете использовать метод List AsReadOnly() для возврата обертки только для чтения.
Ответ 7
private List<string> my_list;
public ReadOnlyCollection<string> myList
{
get { return my_list.AsReadOnly(); }
private set { my_list = value; }
}
Ответ 8
private List<string> _items = new List<string>();
public ReadOnlyCollection<string> Items
{
get { return _items.AsReadOnly(); }
private set { _items = value }
}
Ответ 9
Вот один из способов
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");
}
}
Ответ 10
В платформе .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);} }
Ответ 11
private List<string> myList;
public string this[int i]
{
get { return myList[i]; }
set { myList[i] = value; }
}
Ответ 12
Почему вы используете список. Похоже, что вы действительно хотите разоблачить IEnumerable
public IEnumerable<string> myList { get; private set; }
Теперь пользователи класса могут читать элементы, но не перетаскивать список.
Ответ 13
Вы также можете создать свой обычный список, но выставлять его через свойство типа IEnumerable
private List<int> _list = new List<int>();
public IEnumerable<int> publicCollection{
get { return _list; }
}
Ответ 14
Немного поздно, но тем не менее: мне не нравится использовать оболочку ReadOnlyCollection
, потому что она по-прежнему предоставляет все методы для изменения коллекции, которые все бросают NotSupportedException
при обращении во время выполнения. Другими словами, он реализует интерфейс IList
, но затем нарушает этот же контракт во время выполнения.
Чтобы выразить, что я действительно показываю неизменяемый список, я обычно прибегаю к пользовательскому интерфейсу IIndexable
, который добавляет Length и indexer к IEnumerable
(описанному в в этой статье CodeProject). Это обертка, как это должно было быть сделано в первую очередь IMHO.
Ответ 15
Я еще не видел этот вариант:
private List<string> myList;
public List<string> MyList
{
get { return myList.AsReadOnly().ToList(); }
}
Это должно позволить вам открыть список только для чтения.