.NET 4.0の読み取り専用リストまたは変更不可能なリスト


100

私の知る限りでは、.NET 4.0にはまだ読み取り専用リストがありません。なぜフレームワークはまだこの機能を欠いているのですか?これは、ドメイン駆動設計の最も一般的な機能の1つではありませんか?

JavaがC#よりも優れている数少ない利点の1つは、Collections.unmodifiablelist(list)メソッドの形式です。これは、IList <T>またはList <T>ではかなり遅れているようです。

を使用することIEnumerable<T>は、質問に対する最も簡単な解決策です- ToList使用でき、コピーを返します。


真の読み取り専用にする唯一の本当の方法List<T>は自分で書くことです。私が知っている組み込みのクラスは、LINQクエリなどList<T>、すぐContainsに使える「読み取り専用」機能のすべてをサポートしていません。
jrh

回答:


146

あなたが探しReadOnlyCollectionているのは、.NET2以来存在していたものです。

IList<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = new ReadOnlyCollection<string>(foo);

または

List<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = foo.AsReadOnly();

これにより、ラップされたコレクションに加えられた変更を反映する読み取り専用ビューが作成されます。


1
私は今、この質問をしたことは少し愚かで、ReadOnlyCollectionについてはわかりません
Chris S

54
しないでください-同じものを探しに行ってあなたの質問を見つけたときも私もそうではありませんでした
Roland Tepp

9
これは、見つけるのが面倒なクラスです。System.Collections.Genericではなく、System.Collections.ObjectModel名前空間にあります。それは、それがGeneric名前空間が存在する前の場所だったからだと思います。それでも、基本クラスはObjectModelに残り、汎用クラスはGenericに追加されると思います。彼らには理由があると思いますが、それは不愉快なことです。
BlueMonkMN 2012

5
@BlueMonkMN:この記事を参照して、Collections.Generic名前空間から分離されている理由を確認してください。
Uchitha 2013

7
しかし、それはリストではなく、コレクションです。したがって、それを使用する場合は、ListではなくCollectionを使用するようにすべてのコードを変更する必要があります。
Roman Zabicki、2016年

13

インターフェイスを使用したい人のために:.NET 4.5は、たとえばIReadOnlyListによって実装される一般的なインターフェイスを追加しますList<T>

これはインデクサープロパティに類似してIReadOnlyCollectionおり、追加されItemます。



11

リストの最も一般的なパターンがすべての要素を反復することであるIEnumerable<T>場合、またはIQueryable<T>効果的に読み取り専用リストとしても機能できる場合。


4
リストをIEnumerableとして公開すると、コンシューマーはリストをキャストしてリストに戻し、変更できます。
JulianR 2009年

4
もちろん、これは防弾対策を意図したものではありません。プライベートフィールドを読んで、元のリストを追跡することもできます。これは、これが読み取り専用のままであるべきという意図を説明するものです。
Ana Betts、

5
元のリストを変更するのではなくToList()、単にコピーを呼び出すだけです
Chris S

IEnumerableは「読み取り専用」メソッドの完全なセットではないことに注意してくださいContains。たとえば、のようなメソッドは含まれていません。
jrh 2017

8

2.0では、呼び出しAsReadOnlyてリストの読み取り専用バージョンを取得できます。または、既存IListReadOnlyCollection<T>オブジェクトをラップします。


これは、私が
Chris S

真のList <T>ではなくIList <T>を使用していたため、.NET 4でこれを見逃しました。List <T>を処理している限り、.NET 4ではAsReadOnlyが引き続き使用できることに注意してください。
BlueMonkMN 2012

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.