【问题标题】:Do AsReadOnly returns a copy of the collection?AsReadOnly 是否返回集合的副本?
【发布时间】:2011-10-24 19:01:58
【问题描述】:

我想知道这个方法是返回集合的副本还是只是一个 ReadOnlyCollection 的实例,它将以某种方式包装原始集合,而不读取所有引用。

我必须明白,如果它会浪费内存空间,它会复制所有指向我的实例的指针吗?

感谢您的任何回答。

【问题讨论】:

  • 浪费空间的不是指针的副本,而是指向/引用的对象的副本... ;-)
  • msdn.microsoft.com/en-us/library/e78dcd75.aspx '只读的集合只是一个带有防止......的包装器的集合'
  • 有时,您只需要阅读文档 :-)
  • 你是对的,我没有检查,因为通常他们不指定实现的东西......该死!

标签: c# .net collections


【解决方案1】:

您可以在这里找到:List(Of T).AsReadOnly Method

为防止对 List(Of T) 进行任何修改,仅公开 List(Of T) 通过这个包装器。

只读集合只是一个带有包装器的集合 防止修改集合;因此,如果进行更改 对于基础集合,只读集合反映了那些 变化。

此方法是 O(1) 操作。

因为他们在最后一条语句中说如果您更改源集合,只读集合将反映这些更改,我相信这个包装器不会重新分配任何对象,而是执行您在问题中描述的操作。

【讨论】:

  • 因为......我相信......但这并不能保证代码不会真正复制元素。这只是意味着包装器的编码器(如果足够聪明的话)进行了更改以在没有重复的情况下执行此操作。实际上,包装器可以轻松地返回一个不断更新的集合副本(这意味着比简单副本更浪费......)所以这里我们有一个假设,而不是答案。
【解决方案2】:

List<T> 上的 AsReadOnly 方法仅在现有 List<T> 上返回一个 ReadOnlyCollection<T> 包装器。它不会复制底层的List<T>

【讨论】:

  • 因此,澄清一下,您仍然可以修改通过 IReadOnlyCollection 包装器检索到的单个项目,并将其反映在只读包装器包装的原始集合中。您不能做的是更改集合本身,例如向其中添加或删除项目。所以这个包装器可能只是不可变故事的一部分,如果你想要的是一个带有不可变对象的完全不可变集合。另一部分是在集合中实际拥有不能变异的对象(如 C#9 记录或其他正确封装的对象)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多