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?
答案 0 :(得分:7)
不,第二个列表不是只读的,它仍然是从IEnumerable<T>
生成的列表(具体来说是ICollection<T>
)。 .AsReadOnly()
方法只提供ReadOnlyCollection<MyObject>
,但在弄乱第二个列表时我们不会修改那个集合。
相反,您已创建了一个新的List<MyObject>
,其成员 可编辑(通过List<T>(IEnumerable<T>)
构造函数)。这与IEnumerable<T>
的任何其他ICollection<T>
来源一样,它在下面执行.CopyTo()
。
如果是ReadOnlyCollection<T>
(实现ICollection<T>
),它会在原来的IList<T>
下面调用.CopyTo()
,所以基本上你拥有的是同样如下:
List<MyObject> FirstList = new List<MyObject>();
// Add items to FirstList.
List<MyObject> SecondList = new List<MyObject>(FirstList);
....就第二个清单而言。在传递给构造函数的IEnumerable<T>
是而不是一个ICollection<T>
的其他情况下,它会迭代集合而.Add()
每个成员代替......但它对新名单及其成员的可变性仍然没有影响。