2011-06-27 7 views
0

クライアントアプリケーションから文字列配列を受け取るWCFアプリケーションがあります。次に、これらの配列は、いくつかのカスタムクラスのコンストラクタにパラメータとして渡されます。私は自分自身ではなく、(たとえSystem.Threadingを使っていなくても)スレッドを作成していませんが、安全な側で再生するために各コンストラクタでlock (param.SyncRoot)を使うのは悪いですか?私はすべてのオブジェクトを不変にしているので、配列が変更されないことを保証したいのです。コンストラクタでの配列のロック

+0

現在行っていることのいくつかのコードサンプルを表示できますか? – ChrisWue

答えて

2

私はあなたがものを過度に複製していると思います。
スレッドで可能な限り簡単に物事を維持するための主なことの1つは、ロックの責任の明確な考え方を持たせることです。したがって、スレッドを作成していない場合は、ロックする必要はありません。ロックするだけでは複雑になりますが、値を追加することはありません。
ロックは、作成して使用するオブジェクトの内部で行う必要があります。

1

オブジェクトを不変にする場合は、配列のディープコピーを作成し、そのコピーをオブジェクトに格納する必要があります。参照型が含まれている場合は、配列を公開する必要もありません。コンストラクタ内で配列をロックすることはできません(ロックはusingステートメントで使用されます - ステートメントの終わりの外観も終了します)。さらに、あなたのオブジェクトの生涯にわたるロック配列はナンセンスです。

不変性自体はロックに関連していません。ロックは、複数のスレッドから同時にオブジェクトにアクセスするのを防ぐためのものです。不変性とは、オブジェクトが状態を持ち、状態を変更することができないことを意味します。これはコンストラクタで定義され、オブジェクトの存続期間全体にわたって同じままです。不変オブジェクトを作成するときには、他のオブジェクトと参照を共有することはできず、状態の変更を許可するため、その状態への参照を公開することはできません。

+0

あなたは理解できませんでした...もちろん、コンストラクタの重要な部分で 'lock(array.SyncRoot)'を使うこともできます! – User

+0

アレイへのマルチスレッドアクセスがない場合、その目的は何でしょうか? –

+0

私は今は持っていないかもしれませんが、後で持っているかもしれません... – User

1

オブジェクトを不変にする方法は、コンストラクタやオブジェクト間のデータの受け渡し方法とは関係ありません。

受信オブジェクトはコンストラクタを介して、またはそれ以外のいずれか、配列を取得したら、ReadOnlyCollectionにそれを送り出すことができます。

ReadOnlyCollection<Customer> _customers = new ReadOnlyCollection<Customer>(arrayPassedViaConstructor) 

今、各オブジェクトは、配列の独自の、変更不可能な、コピーを持っています。元の配列(呼び出し元オブジェクト内)が変更された場合でも、受信オブジェクト内の読み取り専用コピーは変更されません。

関連する問題