List <T>如何使用ReadOnly列表复制构造函数?

Gif*_*guy 2 .net c# list readonly-collection

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?
Run Code Online (Sandbox Code Playgroud)

Nic*_*ver 7

不,第二个列表不是只读的,它仍然是从IEnumerable<T>(特别是ICollection<T>在这里)生成的List .该.AsReadOnly()方法只是给出了一个ReadOnlyCollection<MyObject>,但是在弄乱第二个列表时我们不会修改集合.

相反,您已经创建了一个新的List<MyObject>,其成员可编辑的(通过List<T>(IEnumerable<T>)构造函数).这就像任何其他IEnumerable<T>源一样生成ICollection<T>它,它执行一个.CopyTo()底层.

在a ReadOnlyCollection<T>(实现ICollection<T>)的情况下,它调用它来自.CopyTo()的原始IList<T>底层,所以基本上你拥有的是相同的:

List<MyObject> FirstList = new List<MyObject>();
// Add items to FirstList.
List<MyObject> SecondList = new List<MyObject>(FirstList);
Run Code Online (Sandbox Code Playgroud)

....就第二个清单而言.在其他情况下IEnumerable<T>传递给构造是不是一个ICollection<T>,它会遍历集合并.Add()代替各成员......但它仍然对新的名单及其成员的可变性没有影响.