2013-05-16 8 views
6

ich von einer using-Anweisung zu beenden versuchen zu beenden, während in einem umschließenden for-Schleife zu bleiben. z.B.Wie aus einer Anweisung 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 

Ich habe versucht, Bruch mit der mich an // y spuckt, aber ich möchte in der for-Schleife bleiben bei // x so die for-Schleife zu verarbeiten fortgesetzt. Ich weiß, dass ich es schaffen kann, indem ich eine Ausnahme ausspreche und einen Fang benutze, aber ich würde diese relativ teure Operation lieber nicht machen, wenn es einen eleganteren Weg gibt, um aus der Nutzung auszubrechen. Vielen Dank!

+4

Warum nicht 'CONTINUE? – Ofiris

+1

Sie könnten die using-Schleife möglicherweise in eine separate Methode einfügen und zurückgeben, wenn die Bedingung wahr ist. – Rogue

+0

rechts Servy. Ich habe es nicht durchdacht. Gelöscht. – Marco

Antwort

3

Wie @Renan gesagt, Sie ! Operator verwenden können und Ihre Boolesche Ergebnis der Bedingung invertieren. Sie können auch continue C# keyworkd verwenden, um zum nächsten Element Ihrer Schleife zu gehen.

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

Ich denke, die beste Antwort ist eine Mischung aus dieser, meiner und Dave Bishs. Wir könnten eine noch bessere Antwort geben, wenn das OP ein wenig mehr Einblick geben könnte. Gibt es andere Dinge, die Sie innerhalb des 'using' Blocks tun würden, unabhängig von der Bedingung? – Renan

+0

weiter gewinnt es für mich, danke @Renan und Oriani –

3

einfach die if so ändern, dass Sie den Block eingeben, wenn die Bedingung nicht erfüllt ist. Dann haben Sie den Rest des Codes in diesem Block.

0

ich die Logik umkehren würde und sagen:

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 

Auf der anderen Seite, wenn Sie die Verwendung von vollständig überspringen wie Dave Bish schon sagt, wird Ihr Code eine bessere Leistung, weil in den Fällen, in denen Sie nicht das wollte indem Sie ein Objekt nicht einfach erstellen damit nichts zu tun ...

8

vollständig die Verwendung von Skip:

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

Was ist, wenn die Bedingung Teil einer Datenbank/EF usw. Aufruf ist? –

+1

Dann einfach hineinlegen? Wir können nur die beste Lösung empfehlen, basierend auf dem, was in der Frage steht ... –

4

es besteht keine Notwendigkeit aus einem using bl zu brechen ock, weil ein using-Block keine Schleife ausführt. Sie können einfach bis zum Ende durchfallen. Wenn es Code gibt, den Sie nicht ausführen möchten, überspringen Sie ihn mit einer if -Klausel.

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

Haben Sie

continue; 

mit versucht?

+0

Dies ist wahrscheinlich besser als Kommentar in seinem aktuellen Zustand geeignet. Stellen Sie nur ein Beispiel für die Verwendung von 'continue' dar, anstatt eine andere Frage zu stellen. –

0

Ich frage mich, warum u Transaktion Bereiche innerhalb einer for-Schleife erstellen? Ist es nötig? Könnte es zu möglichen Eskalationen bei DTC kommen? Warum nicht so?

using (TransactionScope scope = new TransactionScope()) 
    { 
     for (int i = _from; i <= _to; i++) 
     { 
      if (condition) 
      { 
       // Do the do 
       continue; 
      } 
     } 
    } 
Verwandte Themen