私はプロパティとして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. iterableの呼び出し元リスト()がそれを変更するのはなぜですか?
- 3. 呼び出し元スレッドでインターフェイスコールバックを呼び出すにはどうすればよいですか?
- 4. メソッドの呼び出し元をトラッキングする[呼び出しによって呼び出された]
- 5. 呼び出し元の名前で色を変更してください
- 6. Java Eclipseの呼び出し元による条件付きブレークポイント
- 7. SetText()を呼び出すときにフラグメントレイアウト内のTextviewsが変更されない
- 8. setVisibility(View.VISIBLE)を呼び出すときにフォーカスを変更しない
- 9. 呼び出し元でクロスAppDomain呼び出しが実行されます。
- 10. super.paintComponentがclearRectを呼び出さないようにする
- 11. 別のビュー/ページから呼び出すときにAJAX呼び出しターゲットを変更するにはどうすればよいですか?
- 12. ListPreferencesが変更されたときにonPreferenceChangeメソッドが呼び出されない
- 13. 指示が入力変更で呼び出されない
- 14. 不明な呼び出し元android
- 15. ブロードキャスト受信者のセキュリティを、呼び出し元のパッケージにアクセスできない。
- 16. ruby - 呼び出し元の$ SAFEレベルをメソッドのように継承しないのはなぜですか?
- 17. 呼び出しがGUIを適切に更新しない
- 18. setContentViewが呼び出される前にボタンのプロパティを変更できないのはなぜですか?
- 19. onContextItemSelectedが呼び出されていないようです
- 20. jquery mobileは呼び出しページに応じてページを変更しないようにします
- 21. Delegate.DynamicInvokeが遅すぎる、呼び出しを呼び出す方法を変更するには?
- 22. viewWillDisplayearがpopToRootViewControllerAnimatedを呼び出すときに呼び出されない
- 23. 呼び出されたバットファイルをどのようにして呼び出すことができますか?
- 24. curl_initを呼び出した後にHTMLソースコードを変更するにはどうすればよいですか?
- 25. 幅が変更されたときにListBoxItemがMeasureOverrideを呼び出さないのはなぜですか?
- 26. onActivityResults()メソッドを呼び出す呼び出し元を確認するためにintent paramsを使用するにはどうすればよいですか?
- 27. UISwitchがRestful API呼び出しを呼び出し、UISwitch値を元に戻したい場合
- 28. onReceiveが呼び出されないときに呼び出される
- 29. プログラムで呼び出されたJavadocドックレットの出力を呼び出し元から取得するにはどうすればよいですか?
- 30. strcpy()を呼び出すときに、対応するサブルーチン呼び出しがマシンコードのダンプで呼び出されないのはなぜですか?
は 'リスト'としてそれを公開しないのですか? –
jason
リストの変更やリスト内のオブジェクトの変更だけを防止したいですか? –
リスト内のオブジェクトの完全な完全コピーを作成しない限り、リストの要素が参照型であり、内部リストから返されたリストに参照をコピーするだけであれば、リストをコピーしても問題は解決しません。 – jason