47

List<T>IReadOnlyCollection<T>インターフェイスを実装し、AsReadOnly()返すメソッドを提供しますReadOnlyCollection<T>(これは を実装しますIReadOnlyCollection<T>)。

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

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

ところで。ReadOnlyCollection<T>タイプ読み取りのドキュメント

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

私の頭の中で、コンストラクターを次のように記述することと競合します

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

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

4

2 に答える 2

57

actualList<T>を として返すだけの場合IReadOnlyList<T>、呼び出し元はいつでもそれをキャストして戻してから、好きなようにリストを変更できます。逆に、呼び出しAsReadOnly()によってリストの読み取り専用ラッパーが作成され、コンシューマーは更新できません。

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

于 2013-07-01T06:20:37.833 に答える
27

まず第一に、十分ではないAsReadOnly()ために追加されたわけではありません.NET 2以降のメソッドが存在する間、.NET 4.5以降でのみ利用可能です.IReadOnlyList<T>IReadOnlyList<T>AsReadOnly()

さらに重要なことは、非常に異なる目的AsReadOnly()を果たすことです。IReadOnlyList<T>

ReadOnlyCollection<T>Dictionary<K,V>.Keysやなどのオブジェクト モデルを実装するためのものDictionary<K,V>.Valuesです。これは、プロデューサーがコンテンツを変更できる一方で、コンシューマーがコンテンツを変更できないようにするシナリオ用です。Collection<T>これは、所有者が変更を検証したり、アイテムが追加されたときに副作用を実行したりするためのフックを提供するものと連携して動作します。

IReadOnlyList<T>一方、コレクションの読み取り専用ビューを提供する単なるインターフェイスです。メソッドは、「ランダムアクセスコレクションが必要ですが、それを変更できる必要はありません」と言うために使用できます。たとえば、BinarySearchメソッドは次のようになります。

public int BinarySearch<T>(IReadOnlyList<T> list, int start, int length);

このメソッドを便利にするには、任意の List を渡すことができる必要があります。ラッパー コレクションの作成を強制すると、非常にコストがかかります。

于 2013-07-08T17:05:47.270 に答える