web-dev-qa-db-ja.com

List <T> .AsReadOnly()vs IReadOnlyCollection <T>

_List<T>_は_IReadOnlyCollection<T>_インターフェースを実装し、_ReadOnlyCollection<T>_を返すAsReadOnly()メソッドを提供します(このメソッドは_IReadOnlyCollection<T>_を実装します)。

AsReadyOnly()の使用法/理由は何ですか?その存在は、リストを_IReadOnlyCollection<T>_として返すだけでは十分ではない1つまたは2つのEdgeケースの匂いがします。

最初は、コストの浪費を防ぐためかもしれませんが、_ReadOnlyCollection<T>_のItemsアクセサーでそれができるようです。

ところで。 _ReadOnlyCollection<T>_型のドキュメントは読み取ります

汎用の読み取り専用コレクションの基本クラスを提供します。

私の頭の中では、コンストラクターが

指定したリストの読み取り専用ラッパーである(...)クラスの新しいインスタンスを初期化します。

更新: _ReadOnlyCollection<T>_のItemsが保護されていることがわかりませんでした。

39
tymtam

実際の_List<T>_を_IReadOnlyList<T>_として返すだけの場合、呼び出し側はいつでもそれをキャストバックし、必要に応じてリストを変更できます。逆に、AsReadOnly()を呼び出すと、リストの読み取り専用ラッパーが作成されますが、これは消費者が更新することはできません。

読み取り専用ラッパーは基になるリストに加えられた変更を反映するため、元のリストにアクセスするコードは、読み取り専用バージョンのコンシューマーがそれらの変更を見るという知識でリストを更新できます。

45
dlev