プロパティとして公開List<string>
していますが、オブジェクトの外部での変更は避けたいです。C#でそれを行う最良の方法は何ですか、新しいコピーを作成するList<string>
か、何か他のことをしますか..
4 に答える
型ではできませんList<T>
。最善の方法は、ReadOnlyCollection<T>
型 ( MSDN ) のプロパティを公開することです。
ICollection
メソッドを公開するインターフェースを明示的に実装していると考えるかもしれAdd()
ませんが、心配する必要はありません。
ICollection.Add
ICollection にアイテムを追加します。この実装は常に NotSupportedException をスローします。
ところで、なぜList<T>
タイプが必要なのですか?おそらく、型のプロパティを公開するIEnumerable<T>
だけで十分でしょうか? List<T>
おそらくソート/検索メソッドに組み込まれている、の特定の機能を使用していますか? とにかく、本当に必要な場合はList<T>
、プロパティバッキングフィールドのタイプとして使用し、ReadonlyCollection<T>(IList<T> list)
コンストラクターまたはList<T>.AsReadonly()
メソッド呼び出しを使用して変換できます。AsReadonly()
単一行のメソッドであるため、違いはありませんreturn new ReadOnlyCollection<T>(this);
.
AsReadOnly()
リストの最後に追加
ReadOnlyCollection<string> test = new List<string> {"test"}.AsReadOnly();
戻るIEnumberable<String>
。そうすれば、実装を変更しても(データ構造を使用XYZ
するとプログラムがより効率的になると感じるかもしれません)、呼び出し元はコードを変更する必要がありません。
なぜそのような制約を強制したいのか知りたいだけです。可能であれば、コミュニティに詳細を提供してください。
試す:
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(); }
}
}