2009-10-10 26 views
14

Tôi đang chuyển đổi một số mã Java để C# và đã tìm thấy một vài nhãn "phá vỡ" báo cáo (ví dụ)là có một tương đương với phá vỡ nhãn Java trong C# hoặc một workaround

label1: 
    while (somethingA) { 
     ... 
     while (somethingB) { 
      if (condition) { 
       break label1; 
      } 
     } 
    } 

Có tương đương trong C# (đọc hiện nay cho thấy không) và nếu không có bất kỳ chuyển đổi khác hơn (nói) có cờ bool để cho biết để phá vỡ vào cuối mỗi vòng lặp (ví dụ)

bool label1 = false; 
while (somethingA) 
{ 
    ... 
    while (somethingB) 
    { 
     if (condition) 
     { 
      label1 = true; 
      break; 
     } 
    } 
    if (label1) 
    { 
     break; 
    } 
} 
// breaks to here 

tôi muốn được quan tâm là tại sao C# doesn không có điều này vì nó không có vẻ rất xấu xa.

Trả lời

24

Bạn chỉ có thể sử dụng goto để chuyển trực tiếp đến nhãn.

while (somethingA) 
{ 
    // ... 
    while (somethingB) 
    { 
     if (condition) 
     { 
      goto label1; 
     } 
    } 
} 
label1: 
    // ... 

Trong ngôn ngữ C-like, goto thường kết thúc lên sạch hơn để phá vỡ vòng lồng nhau, như trái ngược với việc theo dõi biến boolean và liên tục kiểm tra chúng vào cuối mỗi vòng lặp.

+0

@ Cảm ơn bạn, tôi đã không nhận ra C# cho phép của goto. –

+7

Bạn được chào đón. Tôi đã không nhận ra Java đã có các câu lệnh có nhãn, do đó chúng tôi thậm chí còn có thể: P –

+3

Một 'return' là sạch hơn, nếu bạn có thể cấu trúc nó theo cách đó. –

1

Refactoring là câu trả lời tốt nhất, nếu bạn có đủ độ phức tạp trong một chức năng mà bạn cần phải thoát ra khỏi hai vòng như vậy:

Ví dụ mớ bòng bong này mã:

List<List<Item>> listOfLists; 

//Merges lists if they are adjacent until only one is left. 
void MergeAdjacentListsUntilOneIsLeft() 
{ 
    while(listOfLists.Count > 1) 
    { 
     BeginIteration: 
     foreach(List<Item> list in listOfLists) 
     { 
      foreach (Item item in list) 
      { 
       foreach(List<Item> otherList in listOfLists) 
       { 
        if(list.IsAdjacentTo(otherList)) 
        { 
         list.AddRange(otherList); 
         listOfLists.Remove(otherList); 
         goto BeginIteration; 
        } 
       } 
      } 
     } 
    } 
} 

trở thành:

List<List<Item>> listOfLists; 

//Merges two lists if they are adjacent. 
void MergeIteration() 
{ 
    foreach(List<Item> list in listOfLists) 
    { 
     foreach (Item item in list) 
     { 
      foreach(List<Item> otherList in listOfLists) 
      { 
       if(list.IsAdjacentTo(otherList)) 
       { 
        list.AddRange(otherList); 
        listOfLists.Remove(otherList); 
        return; 
       } 
      } 
     } 
    } 
} 

//Does it until only one is left. 
void MergeAdjacentListsUntilOneIsLeft() 
{ 
    while(listOfLists.Count > 1) 
    { 
     MergeIteration();   
    } 
} 
Các vấn đề liên quan