Список <T> readonly с частным набором - программирование
Подтвердить что ты не робот

Список <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;}
4b9b3361

Ответ 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(); }
}

Это должно позволить вам открыть список только для чтения.