C # вернуть немодифицируемый список - PullRequest
3 голосов
/ 02 октября 2010

У меня есть класс, который содержит List<Item> У меня есть метод получения класса, который возвращает это. Есть ли что-то, что я могу сделать, чтобы гарантировать, что вызывающий пользователь не может изменить возвращенный список? (Так как это ссылочный тип - я думаю, что изменения в возвращенной ссылке затронут список, сохраненный в исходном объекте)

Ответы [ 2 ]

8 голосов
/ 02 октября 2010

Верните свой список, завернутый в ReadOnlyCollection<T>.

  public ReadOnlyCollection<Item> MyROList {
    get { return new ReadOnlyCollection<Item>(myList); }
  }

  private List<Item> myList = new List<Item>();

Подробнее в других местах на SO .

В зависимости от использования вашего класса, вы можете выделить ReadOnlyCollection во время построения и связать его с базовым List. Если вы ожидаете, что это свойство всегда или большую часть времени понадобится, и базовый List находится в это время, то это разумно. В противном случае вы можете оставить ReadOnlyCollection<Item> член класса null и выделить его по требованию в получателе, если он равен null (с учетом безопасности потока).

4 голосов
/ 02 октября 2010

Хотите ли вы, чтобы какие-либо изменения , сделанные вашим классом в будущем, были отражены в возвращенном списке? Если это так, просто

return new ReadOnlyCollection<T>(list);

было бы хорошо.

Однако, если вы хотите вернуть коллекцию, которая ничего не изменит в будущем (т. Е. Полностью независимая копия исходного списка), вы можете использовать:

return new ReadOnlyCollection<T>(list.ToList());

(Использование метода LINQ ToList - очень простой способ клонирования списка.)

Обратите внимание, что если тип элемента списка является изменяемым ссылочным типом, изменения данных в ссылочных объектах все равно будут видны всем.

...