[英]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.