Vil*_*lx- 47 c# arrays readonly
我有一个非常不可能和原始的情况想要从我的财产返回一个只读数组.到目前为止,我只知道一种方法 - 通过System.Collections.ObjectModel.ReadOnlyCollection<T>.但这对我来说似乎有些尴尬,更不用说这个类失去了通过索引访问数组元素的能力(添加:哎呀,我错过了索引器).有没有更好的方法?什么可以使数组本身不可变?
Jef*_*tes 51
使用ReadOnlyCollection<T>.它是只读的,与你的信念相反,它有一个索引器.
数组不是不可变的,没有使用像这样的包装器就没有办法制作它们ReadOnlyCollection<T>.
请注意,创建ReadOnlyCollection<T>包装器是O(1)操作,不会产生任何性能成本.
更新
其他答案建议只将集合转换为较新的集合 IReadOnlyList<T>,扩展IReadOnlyCollection<T>为添加索引器.不幸的是,这实际上并没有让你控制集合的可变性,因为它可以被转换回原始集合类型并进行变异.
相反,您仍然应该使用ReadOnlyCollection<T>(List<T>方法AsReadOnly()或Array静态方法AsReadOnly()帮助相应地包装列表和数组)来创建对集合的不可变访问,然后直接或作为它支持的任何一个接口公开它,包括IReadOnlyList<T>.
War*_*rty 11
引入的.NET Framework 4.5 IReadOnlyList<T>从IReadOnlyCollection<T>添加扩展而来T this[int index] { /*..*/ get; }.
您可以从投T[]来IReadOnlyList<T>.这样做的一个优点是可以(IReadOnlyList<T>)array理解的是等于array; 没有拳击.
当然,由于没有使用包装器,(T[])GetReadOnlyList()因此是可变的.
如果你真的想要一个返回的数组,但是担心数组的使用者会弄乱内部数据,只需返回一个数组的副本.就个人而言,我仍然认为ReadOnlyCollection<T>是要走的路,但如果你真的想要一个数组......
| 归档时间: |
|
| 查看次数: |
27046 次 |
| 最近记录: |