2009-07-06 10 views
6

文字列の読み取り専用リスト(たとえば、ADO.NETのフィールドのリスト)を保持するために、このような方法を使用するとよいでしょうか。文字列の読み取り専用リスト

var list = new System.Collections.ObjectModel.ReadOnlyCollection<string>(
      new List<string>(4) { "type", "currency", "date", "amount" }); 

これは余分な解決策ですか?

答えて

8

あなたの位置によって異なります。 ReadOnlyCollectionは、リストを変更することを許可されていない他のコードに内部の変更可能なリストを与える必要がある場合に非常に有効です。単純なコードの場合は、ReadOnlyCollectionを使用するのはおそらく過剰です。コードが大きく、リスクがあると、他のプログラマー(またはあなたがダウンしている)が誤ってリストを修正しようとする可能性があります。

簡潔に:ReadOnlyCollectionをイディオムで使用しないでください。意味がある場合はそれを使用してください。

5

可能であれば、静的型チェックを推奨します。 IEnumerable<string>は読み取り専用です。

IEnumerable<string> list = new List<string> { "type", "currency", "date", "amount" }; 

以降のコードでは、リストを変更することはできません、とミスは、コンパイル時にキャッチされます - あなたはリフレクションを使用しない限り、その後反射が同様に実行時チェックを回避するために使用することができます。

+0

いいえ、次のコードは単に 'List 'にキャストすることができます。反射は必要ありません。 –

+1

@KevinBrockもしリフレクションが必要だったとしても、それを回避するのは無理でしょう。http://stackoverflow.com/a/1232332/27423 - あなたの "readonly"ラッパーのアンラップを "ブロック"しようとするのは悪いです。役に立たない。実際の値を追加することなく複雑さ(およびランタイムコスト)を追加します。静的型システムを使用してAPIの正しい使い方を文書化する - それ以外のものは無意味です。 –

4

.NET 2.0に戻ると、ListクラスにはAsReadOnly()メソッドがあります。ジェネリックが来たら、List<T>もそれを手に入れました。 MSDN reference pageです

関連する問題