簡體   English   中英

在 C# 中創建只讀數組的最佳方法是什么?

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

這支持以下任何一項:

  • .NET 4.5(或更高版本)
  • .NETStandard 1.0(或更高版本)
  • 視窗 8.0
  • 視窗電話 8.0
  • 視窗手機應用程序 8.1
  • 可移植類庫(.NETFramework 4.5、Windows 8.0、WindowsPhone 8.0、WindowsPhoneApp 8.1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM