在C#中创build只读数组的最佳方式是什么?

我有一个非常不可能的,原来的情况,想从我的财产返回一个只读数组。 到目前为止,我只知道一种方法 – 通过System.Collections.ObjectModel.ReadOnlyCollection<T> 。 但是这对我来说似乎有些尴尬, 更不用说这个类失去了通过索引来访问数组元素的能力增加了:哎呀,我错过了索引器 )。 有没有更好的办法? 有什么可以使数组本身不可变?

6 Solutions collect form web for “在C#中创build只读数组的最佳方式是什么?”

使用ReadOnlyCollection<T> 。 它是只读的,与您认为的相反,它是一个索引器。

数组不是不可变的,没有像ReadOnlyCollection<T>那样使用包装的方法。

请注意,创buildReadOnlyCollection<T>包装器是O(1)操作,不会产生任何性能成本。

更新
其他答案build议只是将集合投射到更新的IReadOnlyList<T> ,它扩展IReadOnlyCollection<T>以添加索引器。 不幸的是,这实际上并不能控制集合的可变性,因为它可以被转换回原始集合types并发生变化。

相反,您仍然应该使用ReadOnlyCollection<T>List<T>方法AsReadOnly()Array的静态方法AsReadOnly()帮助相应地包装列表和数组),以创build对集合的不可变访问,然后公开,直接或作为它支持的任何一个接口,包括IReadOnlyList<T>

.NET Framework 4.5引入了IReadOnlyList<T> ,它从IReadOnlyCollection<T>扩展,添加T this[int index] { /*..*/ get; } T this[int index] { /*..*/ get; }

你可以从T[]投射到IReadOnlyList<T> 。 这样做的一个优点是(IReadOnlyList<T>)array可理解地等于array ; 没有涉及拳击。

当然,由于没有使用包装, (T[])GetReadOnlyList()将是可变的。

如果你真的想返回一个数组,但是又怕数组的使用者会弄乱内部数据,只要返回一个Array的副本即可。 我个人还是认为ReadOnlyCollection<T>是要走的路,但如果你真的想要一个数组…..

从.NET Framework 2.0起, Array.AsReadOnly会自动为您创build一个ReadOnlyCollection包装器。

IEnumerable浮现在脑海。

您可能需要实现IEnumerable接口并重载此[int]运算符以拒绝对其设置者的访问

  • 在JavaScript中按值复制数组
  • 如何将一个圆形的面具应用到一个numpy数组?
  • 如何使用jQuery发送请求参数数组到servlet $ .ajax?
  • 如果我在C / C ++中定义一个0大小的数组会发生什么?
  • 什么Haskell表示推荐用于二维,无盒子像素arrays与数百万像素?
  • 按索引移动数组中的元素
  • “char s ”这个函数的数组参数中static关键字的用途是什么?
  • 如何在php5中将二维数组转换为一维数组
  • 如何将数组元素转换为PHP中的string?
  • char * vs std ::string在c + +
  • 如果我将数组初始化为0,会发生什么?