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