2013-05-16 47 views
6

Tôi đang cố gắng thoát khỏi câu lệnh đang sử dụng trong khi vẫn ở trong vòng lặp kèm theo. ví dụ.Cách thoát khỏi tuyên bố sử dụng

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 

Tôi đã cố gắng sử dụng ngắt khiến tôi thoát ra tại // y, tuy nhiên tôi muốn duy trì vòng lặp for tại // x để vòng lặp tiếp tục xử lý. Tôi biết rằng tôi có thể làm điều đó bằng cách ném một ngoại lệ và sử dụng một bắt nhưng tôi không muốn làm điều này hoạt động tương đối đắt tiền nếu có một cách thanh lịch hơn để thoát ra khỏi việc sử dụng. Cảm ơn!

+4

Tại sao không 'tiếp tục'? – Ofiris

+1

Bạn có thể đặt vòng lặp sử dụng trong một phương thức riêng biệt và trả về nếu điều kiện là đúng. – Rogue

+0

đúng Servy. Đã không nghĩ rằng nó thông qua. Đã xóa. – Marco

Trả lời

3

Như @Renan nói rằng bạn có thể sử dụng ! điều hành và đảo ngược kết quả bool của bạn với điều kiện. Bạn cũng có thể sử dụng phím số continue C# để đi đến mục tiếp theo của vòng lặp của bạn.

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

Tôi nghĩ câu trả lời tốt nhất là sự kết hợp của điều này, của tôi và của Dave Bish. Chúng tôi có thể cung cấp cho một asnwer tốt hơn nếu OP có thể cung cấp một cái nhìn sâu sắc hơn một chút. Có những thứ khác bạn sẽ làm bên trong khối 'using', bất kể điều kiện không? – Renan

+0

tiếp tục thắng nó cho tôi, nhờ @Renan và Oriani –

3

Chỉ cần thay đổi if để bạn nhập khối nếu điều kiện KHÔNG đúng. Sau đó, có phần còn lại của mã bên trong khối đó.

0

tôi sẽ đảo ngược logic và nói:

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 

Mặt khác nếu bạn bỏ qua bằng cách sử dụng hoàn toàn như Dave bish gợi ý, mã của bạn sẽ thực hiện tốt hơn bởi vì trong trường hợp bạn không muốn sử dụng bạn sẽ không tạo ra một đối tượng đơn giản chỉ để không phải làm gì với nó ...

8

Bỏ qua sử dụng hoàn toàn:

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

Điều gì sẽ xảy ra nếu điều kiện là một phần của cơ sở dữ liệu/cuộc gọi EF? –

+1

Sau đó, chỉ cần đặt nó bên trong? Chúng tôi chỉ có thể đề xuất giải pháp tốt nhất, dựa trên những gì trong câu hỏi ... –

4

không cần để thoát ra khỏi một bl using ock vì khối sử dụng không lặp lại. Bạn có thể đơn giản rơi vào cuối. Nếu có mã bạn không muốn thực thi, hãy bỏ qua nó bằng cách sử dụng if -nhưng.

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

Bạn đã cố gắng sử dụng

continue; 

?

+0

Điều này có lẽ phù hợp hơn với tư cách là nhận xét ở trạng thái hiện tại của nó. Chỉ cần cung cấp một ví dụ về việc sử dụng 'tiếp tục', thay vì đặt ra một câu hỏi khác. –

0

Tôi tự hỏi tại sao bạn muốn tạo phạm vi giao dịch trong vòng lặp for? Có cần thiết không? Có thể gây ra sự leo thang cho DTC không? Tại sao không như thế này?

using (TransactionScope scope = new TransactionScope()) 
    { 
     for (int i = _from; i <= _to; i++) 
     { 
      if (condition) 
      { 
       // Do the do 
       continue; 
      } 
     } 
    } 
Các vấn đề liên quan