【问题标题】:Why there isn't a ReadOnlyList<T> class in the System.Collections library of C#?为什么 C# 的 System.Collections 库中没有 ReadOnlyList<T> 类?
【发布时间】:2010-09-30 15:38:54
【问题描述】:

阅读有关在 C# 中创建只读原始向量的问题(基本上,您不能这样做),

public readonly int[] Vector = new int[]{ 1, 2, 3, 4, 5 }; // You can still changes values

我了解了ReadOnlyCollectionBase。这是允许访问但不修改其位置的对象容器的基类。 Microsoft Docs 中甚至有一个示例。

ReadOnlyCollectionBase Class - Microsoft Docs

我稍微修改了示例以使用任何类型:

public class ReadOnlyList<T> : ReadOnlyCollectionBase {
    public ReadOnlyList(IList sourceList)  {
      InnerList.AddRange( sourceList );
    }

    public T this[int index]  {
      get  {
         return( (T) InnerList[ index ] );
      }
    }

    public int IndexOf(T value)  {
      return( InnerList.IndexOf( value ) );
    }



    public bool Contains(T value)  {
      return( InnerList.Contains( value ) );
    }

}

... 它的工作原理。我的问题是,为什么C#的标准库中不存在这个类,可能在System.Collections.Generic?我错过了吗?它在哪里? 谢谢。

【问题讨论】:

标签: c# readonly generic-collections


【解决方案1】:

还有ReadOnlyCollection&lt;T&gt;,是上面的通用版本。

您可以通过调用list.AsReadOnly() 直接从List&lt;T&gt; 创建一个。

【讨论】:

  • 谢谢,这正是我要找的。​​span>
  • 这不是一个真正的ReadOnlyList&lt;T&gt; - 从某种意义上说,您可以保证ReadOnlyList&lt;T&gt; 的内容永远不会改变 - 因为ReadOnlyCollection&lt;T&gt; 只包装了原始列表,并修改了原始列表list 将修改集合。
  • @M Kloster,但内存级别适用于任何集合。将集合标记为只读实际上只是对使用代码的开发人员的一个建议,即修改它可能会导致不需要的行为。当然,如果集合引用了在内存中找不到的东西,那么实际上强制更改是不可能的。
猜你喜欢
  • 2010-10-30
  • 2010-10-07
  • 2011-03-18
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2019-12-09
  • 2013-12-06
相关资源
最近更新 更多