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

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

使用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]运算符以拒绝对其设置者的访问