私はプロパティとしてList<string>
を公開していますが、オブジェクトの外側での変更を避けたいと考えています。 C#でそれを行う最善の方法は何ですか、私はList<string>
の新しいコピーを作成するか何かをしますか?リスト<String>を呼び出し元が変更できないようにする
1
A
答えて
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()
メソッド呼び出しを使用して実際に違いはありません。
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(); }
}
}
関連する問題
- 1. 呼び出し元に基づいた呼び出し元の振る舞いを、リフレクションなしで呼び出し元をPythonでメンバーにする方法
- 2. Java - 呼び出し元クラスのメソッド変数を変更するにはどうすればよいですか?
- 3. 関数の呼び出しによる呼び出しは、パラメータの元の値を変更しますか?
- 4. iterableの呼び出し元リスト()がそれを変更するのはなぜですか?
- 5. proxyquireが元のコードを呼び出さないようにしますか?
- 6. 呼び出し元スレッドでインターフェイスコールバックを呼び出すにはどうすればよいですか?
- 7. 呼び出し元(派生)関数は、呼び出し元(基本)関数の変数にC言語でどのようにアクセスできますか?
- 8. 呼び出し先が返すオブジェクトのスコープ。呼び出し元ローカル変数?
- 9. なぜ `<< std :: endl`が呼び出したい演算子を呼び出さないのですか?
- 10. 呼び出し値やリストの値を変更する
- 11. ListPreferenceが値を変更したときにSharedPreferences.OnSharedPreferenceChangeListenerが呼び出されない
- 12. メソッドの呼び出し元をトラッキングする[呼び出しによって呼び出された]
- 13. Azure Germany:変更を呼び出すパスワードが機能しない
- 14. 呼び出し元の名前で色を変更してください
- 15. クラスを変更するときにNSNotificationCenterが呼び出されない
- 16. Java Eclipseの呼び出し元による条件付きブレークポイント
- 17. <script>のタグをクライアント側で変更せずにAJAX呼び出しで呼び出す方法JS
- 18. メソッドを呼び出すときにパラメータが変更される
- 19. Function.prototype.apply()で呼び出し元関数の引数を変更する方法は?
- 20. Pythonで呼び出し元の現在の作業ディレクトリを変更する
- 21. ionic:<input>の変更機能が呼び出されていない
- 22. 実行可能な呼び出し元が終了しない
- 23. RxJava api呼び出しが成功したときにのみキャッシュを呼び出すようにしたい
- 24. ASP.net PageMethod呼び出しが他のJavaScript関数呼び出しをブロックしないようにする方法
- 25. 呼び出し元アクティビティでonActivityResultが呼び出されていません
- 26. レンダリングが状態変更で呼び出されていない
- 27. API呼び出しの更新:API呼び出し後に値がnullでないことを確認するにはどうすればよいですか?
- 28. super.paintComponentがclearRectを呼び出さないようにする
- 29. メディアプレイヤーがonCompletionListenerを呼び出せないようにする
- 30. ZMQ C++がrand()を呼び出さないようにする
は 'リスト'としてそれを公開しないのですか? –
jason
リストの変更やリスト内のオブジェクトの変更だけを防止したいですか? –
リスト内のオブジェクトの完全な完全コピーを作成しない限り、リストの要素が参照型であり、内部リストから返されたリストに参照をコピーするだけであれば、リストをコピーしても問題は解決しません。 – jason