クライアントアプリケーションから文字列配列を受け取るWCFアプリケーションがあります。次に、これらの配列は、いくつかのカスタムクラスのコンストラクタにパラメータとして渡されます。私は自分自身ではなく、(たとえSystem.Threading
を使っていなくても)スレッドを作成していませんが、安全な側で再生するために各コンストラクタでlock (param.SyncRoot)
を使うのは悪いですか?私はすべてのオブジェクトを不変にしているので、配列が変更されないことを保証したいのです。コンストラクタでの配列のロック
答えて
私はあなたがものを過度に複製していると思います。
スレッドで可能な限り簡単に物事を維持するための主なことの1つは、ロックの責任の明確な考え方を持たせることです。したがって、スレッドを作成していない場合は、ロックする必要はありません。ロックするだけでは複雑になりますが、値を追加することはありません。
ロックは、作成して使用するオブジェクトの内部で行う必要があります。
オブジェクトを不変にする場合は、配列のディープコピーを作成し、そのコピーをオブジェクトに格納する必要があります。参照型が含まれている場合は、配列を公開する必要もありません。コンストラクタ内で配列をロックすることはできません(ロックはusing
ステートメントで使用されます - ステートメントの終わりの外観も終了します)。さらに、あなたのオブジェクトの生涯にわたるロック配列はナンセンスです。
不変性自体はロックに関連していません。ロックは、複数のスレッドから同時にオブジェクトにアクセスするのを防ぐためのものです。不変性とは、オブジェクトが状態を持ち、状態を変更することができないことを意味します。これはコンストラクタで定義され、オブジェクトの存続期間全体にわたって同じままです。不変オブジェクトを作成するときには、他のオブジェクトと参照を共有することはできず、状態の変更を許可するため、その状態への参照を公開することはできません。
オブジェクトを不変にする方法は、コンストラクタやオブジェクト間のデータの受け渡し方法とは関係ありません。
受信オブジェクトはコンストラクタを介して、またはそれ以外のいずれか、配列を取得したら、ReadOnlyCollectionにそれを送り出すことができます。
ReadOnlyCollection<Customer> _customers = new ReadOnlyCollection<Customer>(arrayPassedViaConstructor)
今、各オブジェクトは、配列の独自の、変更不可能な、コピーを持っています。元の配列(呼び出し元オブジェクト内)が変更された場合でも、受信オブジェクト内の読み取り専用コピーは変更されません。
- 1. コンストラクタの配列
- 2. 配列点のコンストラクタ
- 3. コンストラクタの配列初期化
- 4. C++配列コンストラクタの引数
- 5. コンストラクタの配列を認識
- 6. クラスのコンストラクタと配列
- 7. 配列のコンストラクタ関数
- 8. 配列のコンストラクタの初期化リストをC++で配列
- 9. コンストラクタでの初期化配列 - Java
- 10. ロック配列Com例外
- 11. 可変サイズの配列のコンストラクタ
- 12. 私の動的配列のコンストラクタ
- 13. JSコンストラクタ関数と配列
- 14. 一般的な配列コンストラクタ
- 15. コンストラクタに配列を渡す?
- 16. コンストラクタの配列パラメータから配列クラスメンバを埋める方法
- 17. 難読化Javascriptが配列のコンストラクタ
- 18. C++:配列のコンストラクタ初期化リスト?
- 19. 危険なテンプレート配列のコンストラクタは
- 20. 配列のリスト()コンストラクタを使用
- 21. 配列でコンストラクタを使用するD
- 22. ロック、ペーパー、ハサミ、配列を使用して
- 23. のF#の引用、配列、コンストラクタで自己識別子
- 24. は私が私のコンストラクタでの状態配列を持つ
- 25. C++コンストラクタのクラスメンバ配列の2次元配列サイズを設定する
- 26. 2d配列をコンストラクタに渡します。
- 27. コンストラクタに配列を渡すには?
- 28. 関数ポインタを持つ配列コンストラクタ?
- 29. 動的文字列配列のコンストラクタとnullが返される
- 30. コンストラクタの初期化リストで配列を初期化する
現在行っていることのいくつかのコードサンプルを表示できますか? – ChrisWue