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

时间:2010-12-05 09:24:59

标签: c# .net 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?

1 个答案:

答案 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()每个成员代替......但它对新名单及其成员的可变性仍然没有影响。