2009-06-11 11 views
74

私には分かりますが、.NET 4.0にはまだ読み取り専用リストがありません。フレームワークにはまだこの機能がないのはなぜですか?これは、domain-driven designの共通機能の1つではありませんか?.NET 4.0の読み取り専用リストまたは変更不可能なリスト

のC#を超えるJavaが持っているいくつかの利点の一つは、IListの< T>や一覧< Tで長年の懸案であるようだCollections.unmodifiablelist(list)方法、の形式です>。

IEnumerable<T>を使用すると、ToListを使用してコピーを返すのが最も簡単な解決策です。

+0

真の読み取り専用 'List 'を持っている唯一の本当の方法のように思えますが、あなた自身で書くことです、私が知っているクラスはビルドされておらず、 'List ' 'Contains'、LINQクエリなどのような箱の外にあります。 – jrh

答えて

110

あなたはReadOnlyCollectionを探しています。これは.NET2以降です。

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

または

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

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

+0

ReadOnlyCollectionについてよくわからない、今この質問を少しばかげていると感じています –

+36

- 私は同じことを探しに行ったときにあなたの質問を見つけました –

+7

これは面倒な難しいクラスです。 System.Collections.Genericの代わりに、System.Collections.ObjectModel名前空間にあります。ここで、それを見つけることができます。私はGeneric名前空間が存在する前であったからだと思います。それでも、私は、基本クラスがObjectModelに残っていて、ジェネリッククラスがGenericに追加されると期待します。私は彼らに理由があったと思うが、迷惑をかける。 – BlueMonkMN

7

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

+0

真のリストの代わりにIList を使用していたので、.NET 4でこれを逃しました。 AsReadOnlyは、リストを扱っている限り、.NET 4で引き続き使用できることに注意してください。 –

+0

の後ろにあったCollections.unmodifiablelist(list)に相当する – BlueMonkMN

13

フレームワーク内に既にReadOnlyCollectionはありますか?

9

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

+2

ListをIEnumerableとして公開すると、消費者は単にリストに戻して変更することができます。 – JulianR

+3

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

+5

'ToList()'を呼び出すだけで元のリストを修正しているわけではありません。コピーは –

5

インターフェイスを使用したい人向け: .NET 4.5には、List<T>で実装されている汎用のIReadOnlyListインターフェイスが追加されています。

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

関連する問題