Как List <T>копирует конструктор со списками ReadOnly? - PullRequest
2 голосов
/ 05 декабря 2010

Статья MSDN на самом деле не объясняет этого.

List<MyObject> FirstList = new List<MyObject>();
// Add items to FirstList.
List<MyObject> SecondList = new List<MyObject>(FirstList.AsReadOnly());
// Is SecondList a read-only collection?

1 Ответ

7 голосов
/ 05 декабря 2010

Нет, второй список не только для чтения, это все еще Список, сгенерированный из IEnumerable<T> (в частности, ICollection<T> здесь). Метод .AsReadOnly() просто дает ReadOnlyCollection<MyObject>, но мы не изменяем эту коллекцию при работе со вторым списком.

Вместо этого вы создали новый List<MyObject> с его членами, который доступен для редактирования (с помощью конструктора List<T>(IEnumerable<T>)). Это делает генерацию как любой другой источник IEnumerable<T>, который является ICollection<T>, он выполняет .CopyTo() снизу.

В случае ReadOnlyCollection<T> (который реализует ICollection<T>), он вызывает .CopyTo() на исходном IList<T>, под которым он был, так что в основном то, что у вас есть, то же самое как:

List<MyObject> FirstList = new List<MyObject>();
// Add items to FirstList.
List<MyObject> SecondList = new List<MyObject>(FirstList);

.... что касается второго списка. В других случаях, когда IEnumerable<T>, переданный конструктору, равен , а не a ICollection<T>, он будет перебирать коллекцию и .Add() каждый элемент вместо ... но это будет по-прежнему не влияет на изменчивость нового списка и его членов.

...