2013-05-16 6 views
6

囲みforループにとどまっているときにusingステートメントを終了しようとしています。例えば。私は// Yで私を吐き出すブレークを使用してみましたがusingステートメントの終了方法

for (int i = _from; i <= _to; i++) 
{ 

    try 
    { 

     using (TransactionScope scope = new TransactionScope()) 
     { 
      if (condition is true) 
      { 
       // I want to quit the using clause and 
       // go to line marked //x below 
       // using break or return drop me to line //y 
       // outside of the for loop. 
      } 

     } 

    } //x 
} 
//y 

は、しかし、私はのためのループが処理し続けるので、// xでのforループのままにしたいです。私は例外を投げてキャッチを使うことでそれを行うことができることを知っていますが、使い方から脱却するよりエレガントな方法があれば、この比較的高価な操作をしないでください。ありがとう!

+4

なぜ「続行」しませんか? – Ofiris

+1

おそらくuseループを別のメソッドに入れ、条件が真であれば戻ります。 – Rogue

+0

右。それを考えなかった。削除されました。 – Marco

答えて

3

@Renanあなたが!演算子を使用し、条件に、あなたのブール結果を反転することができます言ったように。 continue C#keyworkdを使用して、ループの次の項目に移動することもできます。

for (int i = _from; i <= _to; i++) 
{ 
    try 
    { 
        using (TransactionScope scope = new TransactionScope()) 
        { 
            if (condition is true) 
            { 
                // some code 
  
                continue; // go to next i 
            } 
        } 
    } 
} 
+0

私はこのベストミックスと私とDave Bish'sのミックスだと思います。 OPがもう少し洞察力を提供できるなら、我々はより良​​いasnwerを与えることができます。条件にかかわらず、 'using'ブロックの中であなたがやるべき他のものはありますか? – Renan

+0

私のために勝ち続ける、ありがとう@RenanとOriani –

3

条件が真でない場合は、ブロックを入力するようにifを変更してください。次に、そのブロックの残りの部分をそのブロックの中に置きます。

0

私はロジックを逆にして言う:

for (int i = _from; i <= _to; i++) 
{ 

    try 
    { 

     using (TransactionScope scope = new TransactionScope()) 
     { 
      if (condition is false) 
      { 
       // in here is the stuff you wanted to run in your using 
      } 
      //having nothing out here means you'll be out of the using immediately if the condition is true 
     } 

    } //x 
} 
//y 

一方あなたはデイブBISHが示唆するような場合にあなたが望んでいなかったところから、あなたのコードは、パフォーマンスが向上します完全に使用をスキップした場合...あなたはそれで何もしないために単にオブジェクトを作成しません

8

を使用すると、完全に使用してスキップ:

if (condition is false) 
{ 
    using (TransactionScope scope = new TransactionScope()) 
    { 
.... 
+0

条件がデータベース/ EFなどの呼び出しの場合はどうなりますか? –

+1

それからちょうどそれを置く?問題の内容に基づいて、最良の解決策を提案することができます。 –

4

using BLから抜け出す必要はありません使用ブロックがループしないので、ock。あなたは単に最後まで落ちることができます。実行したくないコードがある場合は、ifを使用してスキップしてください。

using (TransactionScope scope = new TransactionScope()) 
    { 
     if (condition) 
     { 
      // all your code that is executed only on condition 
     } 
    } 
-1

あなたは

continue; 

を使用してみましたか?

+0

これはおそらく現在の状態のコメントとして適しています。別の質問をする代わりに、 'continue'を使用する例を提供してください。 –

0

forループ内でトランザクションスコープを作成したいのはなぜですか?それは必要ですか? DTCへのエスカレーションを引き起こす可能性がありますか?なぜこれが好きではない?

using (TransactionScope scope = new TransactionScope()) 
    { 
     for (int i = _from; i <= _to; i++) 
     { 
      if (condition) 
      { 
       // Do the do 
       continue; 
      } 
     } 
    } 
関連する問題