106

ブロックreturn内で呼び出すのが安全で良いアプローチかどうかを知りたいだけです。using

例:

using(var scope = new TransactionScope())
{
  // my core logic
  return true; // if condition met else
  return false;
  scope.Complete();
}

最後に最も巻き毛のブレース dispose()が中止されることを私たちは知っています。しかし、上記の場合はreturn、コントロールが指定されたスコープ(AFAIK)からジャンプするためです。

  1. scope.Complete()は呼ばれますか?
  2. スコープのdispose()メソッドについても同様です。
4

6 に答える 6

159

使用中のブロックは単なるブロックであるため、ブロックreturn内で呼び出すのは完全に安全です。usingtry/finally

上記の例では、returnの後trueに、スコープが破棄され、値が返されます。return false、および呼び出されscope.Complete()ませDisposeただし、finallyブロック内にあるため、呼び出されます。

あなたのコードは本質的にこれと同じです(それが理解しやすい場合):

var scope = new TransactionScope())
try
{
  // my core logic
  return true; // if condition met else
  return false;
  scope.Complete();
}
finally
{
  if( scope != null) 
    ((IDisposable)scope).Dispose();
}

トランザクションをコミットする方法がないため、トランザクションがコミットされないことに注意してくださいscope.Complete()

于 2012-08-02T12:02:31.590 に答える
7

それは問題ありません-finally句(これは、内部で句の閉じ中括弧が行うことusingです)は、スコープが残されたときに、どのように関係なく、常に実行されます。

ただし、これは、finallyブロックにあるステートメントにのみ当てはまります(を使用する場合は明示的に設定できませんusing)。したがって、あなたの例でscope.Complete()は、呼び出されることはありません(ただし、到達不能コードについてコンパイラーが警告することを期待しています)。

于 2012-08-02T12:02:48.883 に答える
2

一般的に、それは良いアプローチです。ただし、あなたの場合、を呼び出す前に戻るとscope.Complete()、TransactionScopeが破棄されます。デザインによって異なります。

したがって、このサンプルでは、​​Complete()は呼び出されず、スコープはIDisposableインターフェイスを継承していると想定して破棄されます。

于 2012-08-02T12:03:17.643 に答える
2

scope.Completeは、必ず前に呼び出す必要がありますreturn。コンパイラは警告を表示し、このコードが呼び出されることはありません。

それ自体に関して-はい、ステートメントreturn内でそれを呼び出すのは安全です。using使用はtryに変換されます-最後に舞台裏でブロックし、最後にブロックが確実に実行されます。

于 2012-08-02T12:07:48.857 に答える
1

提供した例では、問題があります。scope.Complete()呼び出されることはありません。return次に、ステートメント内でステートメントを使用することはお勧めできませんusing。以下を参照してください。

using(var scope = new TransactionScope())
{
    //have some logic here
    return scope;      
}

この簡単な例では、要点は次のとおりです。scope使用ステートメントが終了すると、の値はnullになります。

したがって、ステートメントを使用して内部に戻らない方がよいでしょう。

于 2012-08-02T12:09:49.307 に答える
0

この例では、scope.Complete()は実行されません。ただし、returnコマンドは、スタックに割り当てられているすべてのものをクリーンアップします。GCは、参照されていないすべてのものを処理します。ですから、GCで拾えないものがなければ問題ありません。

于 2012-08-02T12:07:35.603 に答える