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?
最佳答案
不,第二个列表不是只读的,它仍然是一个从 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>
传递给构造函数的是不是 ICollection<T>
, 它会遍历集合和 .Add()
每个成员代替......但它仍然不会对新列表及其成员的可变性产生影响。
关于c# - List<T> 如何使用 ReadOnly 列表复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4358151/