1

これはばかげた質問かもしれませんが、ロックを使用して割り当てを行う必要がありますか、それとも単純に結果を返すことができますか?

例えば:

ファイル名の IEnumerable リストを返すプライベート ヘルパー メソッドがあります。ロックを使用して、m_transfers コレクションを反復処理している間、メソッドがスレッド セーフであることを確認します。

宿題は必要ですか...

IEnumerable<String> updated;
lock (m_transfers.Lock)
{
    updated = m_transfers.Values.Where(transfer => transfer.Updated)
                         .Select(transfer => transfer.Filename);
}
return updated;

または、私はただすることができます

lock (m_transfers.Lock)
{
    return updated = m_transfers.Values.Where(transfer => transfer.Updated)
                            .Select(transfer => transfer.Filename);
}
4

3 に答える 3

3

いいえ、変数を追加する必要はありません。どちらの場合も、ロックを放棄した後にのみ実際に値を返すため、セマンティクスはどちらの方法でも同じです。

変数は目的を果たさないので、私はそれを削除して2番目のバージョンを使用します-技術的には、コンパイラは実際にそれを元に戻します(alockにはtry/が含まれ、ILレベルでは;の内部からfinallyはできません。したがって、コンパイラは実際に最初のバージョンのように書き込みます)。rettry

于 2012-09-12T11:18:26.083 に答える
1

try、の場合にこれを行う必要がないのと同じようにusing、ここでこれを行う必要はありません。コンパイラは、関数の終了時に必要なコードを配置します。

詳細については、これを確認してください:モニターとロック

于 2012-09-12T11:18:17.510 に答える
0

どちらも有効です。
実行を返すとすぐにブロックから出てきます。

于 2012-09-12T11:18:05.937 に答える