2013-05-16 19 views
6

Próbuję wyjść z użycia oświadczenia podczas pobytu w pętli otaczającej. na przykład.Jak wyjść z użycia oświadczenia

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 

Próbowałem, używając przerwę, która wyrzuca mnie na // y, jednak chcę pozostać w pętli for w // x tak dla pętli kontynuuje przetwarzanie. Wiem, że mogę to zrobić, rzucając wyjątek i używając haczyka, ale wolałbym nie robić tej stosunkowo kosztownej operacji, jeśli istnieje bardziej elegancki sposób na wyrwanie się z użycia. Dzięki!

+4

Dlaczego nie "kontynuować"? – Ofiris

+1

Możesz ewentualnie umieścić pętlę wykorzystującą w osobnej metodzie i zwrócić, jeśli warunek jest prawdziwy. – Rogue

+0

prawym Servy. Nie przemyślałem tego. Usunięto. – Marco

Odpowiedz

3

Jak @Renan powiedział można użyć ! operatora i odwrócić swój wynik bool na stanie. Możesz również użyć continue C# keyworkd, aby przejść do następnego elementu swojej pętli.

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

Myślę, że najlepszą odpowiedzią jest mieszanka tego, mojego i Dave'a Bisha. Moglibyśmy dać jeszcze lepszą odpowiedź, gdyby OP mógł zapewnić nieco więcej wglądu. Czy są inne rzeczy, które robiłbyś wewnątrz bloku 'using', niezależnie od stanu? – Renan

+0

kontynuować wygrywa to dla mnie, dzięki @Renan i Oriani –

3

Wystarczy zmienić if, aby wprowadzić blok, jeśli warunek NIE jest spełniony. Następnie resztę kodu wewnątrz tego bloku.

0

chciałbym odwrócić logikę i powiedzieć:

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 

Z drugiej strony, jeśli pominąć przy użyciu zupełnie jak sugeruje Dave Bish, Twój kod będzie działać lepiej, ponieważ w przypadkach, gdzie nie chciał za pomocą nie będzie utworzyć obiekt po prostu nic nie robić z nim ...

8

pominąć przy użyciu całkowicie:

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

Co się stanie, jeśli warunek jest częścią bazy danych/EF itp. Wywołania? –

+1

Po prostu włóż to do środka? Możemy tylko polecić najlepsze rozwiązanie, oparte na tym, o czym jest mowa ... –

4

nie ma potrzeby, aby wyrwać się z using bl ock, ponieważ blok używający nie zapętla się. Możesz po prostu przejść do końca. Jeśli istnieje kod, którego nie chcesz wykonywać, pomiń go, używając opcji if -clause.

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

Czy próbowali za pomocą

continue; 

?

+0

Jest to prawdopodobnie lepiej nadaje się jako komentarz w bieżącym stanie. Wystarczy podać przykład użycia 'kontynuuj', zamiast zadawać kolejne pytanie. –

0

Zastanawiam się, dlaczego chcesz tworzyć zakresy transakcji w ramach pętli for? Czy to konieczne? Czy możliwe są ewentualne eskalacje do DTC? Dlaczego nie w ten sposób?

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