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

标签 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?

最佳答案

不,第二个列表不是只读的,它仍然是一个从 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/

相关文章:

c# - 有没有办法将 lambda 表达式作为变量或参数传递?

c# - 如何在 C# 应用程序中使用 DSN 文件?

.net - SQLite中uniqueidentifier中的乱码文本

python - 为什么集合比 python 中的列表大?

c# - 可能生成编译时错误的自定义属性

c# - 使组件根据大小变化填充最大空白

.net - 升级 .NET 应用程序数据层

c# - WPF 中的全局鼠标 Hook

java - java中访问列表索引时出现索引越界异常

用于存储类实例的 Python 列表?