[英]What's the best way of creating a readonly array in C#?
我想从我的财产中返回一个只读数组,这是一种极不可能和原始的情况。 到目前为止,我只知道一种方法 - 通过System.Collections.ObjectModel.ReadOnlyCollection<T>
。 但这对我来说似乎有些尴尬,更不用说这个类失去了通过索引访问数组元素的能力(补充说:哎呀,我错过了索引器)。 没有更好的办法吗? 可以使数组本身不可变的东西?
使用ReadOnlyCollection<T>
。 它是只读的,并且与您所相信的相反,它有一个索引器。
数组不是一成不变的,如果不使用像ReadOnlyCollection<T>
这样的包装器,就无法使它们如此。
请注意,创建ReadOnlyCollection<T>
包装器是一个 O(1) 操作,并且不会产生任何性能成本。
更新
其他答案建议只将集合转换为更新的IReadOnlyList<T>
,它扩展IReadOnlyCollection<T>
以添加索引器。 不幸的是,这实际上并不能让您控制集合的可变性,因为它可以转换回原始集合类型并进行变异。
相反,您仍然应该使用ReadOnlyCollection<T>
( List<T>
方法AsReadOnly()
或Array
的静态方法AsReadOnly()
有助于相应地包装列表和数组)来创建对集合的不可变访问,然后公开它,直接或作为它支持的任何一种接口,包括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()
将是可变的。
从 .NET Framework 2.0 开始, Array.AsReadOnly会自动为您创建一个ReadOnlyCollection包装器。
如果你真的想要返回一个数组,但又怕数组的消费者会弄乱内部数据,就返回一个数组的副本。 我个人仍然认为ReadOnlyCollection<T>
是要走的路,但如果你真的想要一个数组......
我认识到这是一个老问题,但现在有包含ImmutableArray类型的 .NET 包。 内置于 .NET Core 3,可通过NuGet for Full framework 4.5 使用
IEnumerable 浮现在脑海中。
您可能想要实现 IEnumerable 接口并重载 this[int] 运算符以拒绝访问它的 setter
现在支持不可变集合。 请参阅https://www.nuget.org/packages/System.Collections.Immutable
这支持以下任何一项:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.