1

プロパティとして公開List<string>していますが、オブジェクトの外部での変更は避けたいです。C#でそれを行う最良の方法は何ですか、新しいコピーを作成するList<string>か、何か他のことをしますか..

4

4 に答える 4

6

型ではできません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);.

于 2012-04-30T20:19:18.940 に答える
2

AsReadOnly()リストの最後に追加

ReadOnlyCollection<string> test = new List<string> {"test"}.AsReadOnly();
于 2012-04-30T20:20:02.913 に答える
1

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

なぜそのような制約を強制したいのか知りたいだけです。可能であれば、コミュニティに詳細を提供してください。

于 2012-04-30T20:20:26.057 に答える
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(); }
    }        
}
于 2012-04-30T20:27:14.640 に答える