为什么C#的System.Collections库中没有ReadOnlyList<T>类?

36

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

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

我了解了ReadOnlyCollectionBase。这是一个基类,用于包含对象的容器,允许访问它们的位置,但不能修改。甚至在Microsoft Docs中有一个示例。

ReadOnlyCollectionBase类 - 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中吗?我有遗漏吗?它在哪里?谢谢。


3
更新 2015:.NET 4.5 现在拥有 ImmutableList https://msdn.microsoft.com/zh-cn/library/dn467185(v=vs.111).aspx - Colonel Panic
1个回答

44

这不是真正的 ReadOnlyList<T> - 在这种情况下,您不能保证 ReadOnlyList<T> 的内容永远不会更改 - 因为 ReadOnlyCollection<T> 只是包装原始列表,并且修改原始列表将修改该集合。 - M Kloster
@M Kloster,但在内存级别上对于任何集合都是正确的。将集合标记为只读实际上只是向使用代码的开发人员提供修改它可能导致不希望的行为的建议。当然,如果集合引用了内存中找不到的内容,则实际强制更改将是不可能的。 - Rhaokiel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接