2012-04-30 3 views
1

私はプロパティとしてList<string>を公開していますが、オブジェクトの外側での変更を避けたいと考えています。 C#でそれを行う最善の方法は何ですか、私はList<string>の新しいコピーを作成するか何かをしますか?リスト<String>を呼び出し元が変更できないようにする

+4

は 'リスト'としてそれを公開しないのですか? – jason

+2

リストの変更やリスト内のオブジェクトの変更だけを防止したいですか? –

+2

リスト内のオブジェクトの完全な完全コピーを作成しない限り、リストの要素が参照型であり、内部リストから返されたリストに参照をコピーするだけであれば、リストをコピーしても問題は解決しません。 – jason

答えて

6

これはList<T>タイプでは不可能です。最も良い方法は、ReadOnlyCollection<T>タイプ(MSDN)の公表を公開することです。あなたはそれが明示的にAdd()方法を公開しますが、心配していることを念頭に置いて保管しないでICollectionインターフェイスを実装検討することができる

ICollection.Add

いるICollectionに項目を追加します。この実装は常にNotSupportedExceptionをスローします。

なぜ、List<T>タイプが必要ですか?おそらくタイプIEnumerable<T>のプロパティを公開するのは十分でしょうか? List<T>のどの特定の機能を使用していますか?おそらく、ソート/検索方法に組み込まれていますか?とにかく実際にList<T>が必要な場合は、それをプロパティバッキングフィールドの型として使用し、ReadonlyCollection<T>(IList<T> list)コンストラクタ経由で変換するか、またはがreturn new ReadOnlyCollection<T>(this);を実行する1行のメソッドであるため、List<T>.AsReadonly()メソッド呼び出しを使用して実際に違いはありません。

+0

これは 'List 'を返す要求を満たしません。 – jason

+0

彼は、変更不可能なList オブジェクトを返すことはできないと述べました。 – Blam

+0

@Blam:彼はそれを編集した。その幽霊の編集の一つ。彼らのことが嫌いです。 – jason

2

は戻りIEnumberable<String>リストの末尾

ReadOnlyCollection<string> test = new List<string> {"test"}.AsReadOnly(); 
1

AsReadOnly()を追加します。そうすれば、実装を変更しても(XYZデータ構造によってプログラムがより効率的になると感じるかもしれません)、呼び出し元はコードを変更する必要はありません。

なぜ私はそのような制約を強制したいのか不思議です。可能であれば、より多くの詳細をコミュニティに伝えてください。

0

試してみてください。

MyClass myClass = new MyClass(); 

class MyClass 
{ 
    public MyClass() 
    { 
     _MyProperty = new List<string>(); 
     _MyProperty.Add("Test 1"); 
     _MyProperty.Add("Test 2"); 
    } 
    private List<string> _MyProperty; 
    public System.Collections.ObjectModel.ReadOnlyCollection<string> MyProperty 
    { 
     get { return _MyProperty.AsReadOnly(); } 
    }   
} 
+0

この場合、まだMyProperty.Add( "new item") ' – sll

+0

@Firoz : 'obj.MyProperty.Add(x)'は、 'MyProperty'にセッターがあることを要求しません。 getterは* public * 'Add'メソッドを使ってプライベートリスト(* real *リスト)を返すので、自由にそれを追加することができます。 – cHao

+0

@cHao:そうです。 MyPropertyではコレクションに項目を追加することができます。それを修正するために、自分のコードを修正しました。 –

関連する問題