2009-10-10 4 views
14

Я превращающий некоторые Java-код в C# и нашел несколько помеченных операторов «перерыва» (например)есть эквивалентный меченый перерыв Java в C# или обходной

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

Есть ли эквивалент в C# (текущее значение не предлагает), и если не существует какой-либо преобразования, кроме (например), имеющие BOOL флаги, чтобы указать, следует ли разбить на каждом конце петли (например)

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

мне было бы интересно, почему C# Безразлично У меня это есть, потому что это не кажется очень злым.

ответ

24

Вы можете просто использовать goto, чтобы перейти непосредственно к этикетке.

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

В C-подобных языках, goto часто заканчивается чистящее средство для разрушения вложенных циклов, в отличие от отслеживания логических переменных и повторно проверять их в конце каждого цикла.

+0

@Mark спасибо, я не понимал, что C# допускает goto's. –

+7

Добро пожаловать. Я не понимал, что Java помечены как заявления, так что это делает нас еще лучше: P –

+3

«Возврат» чище, если вы можете его структурировать. –

1

Рефакторинг является лучшим ответом, если у вас есть достаточно сложности в функции, что вам нужно, чтобы вырваться из двух таких петель:

Например, это нагромождение кода:

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; 
        } 
       } 
      } 
     } 
    } 
} 

Становится:

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();   
    } 
}