2016-03-17 2 views
0

Я просто наткнулся на проблему во время программирования, которая действительно выиграет от подобной структуры. Рассмотрим следующий пример:Gotolike структура/улучшено продолжение - goto всегда зло?

//tries to find a solution for a problem 3 times 
//in this process copies elements from old to newList 
foreach (var tryNbr in Util.range(0,3)) 
{ 
    List<A> newList = new List<A>(); 
    List<A> oldList = workList; 
    while(oldList.Count != 0) 
    { 
     List<A> possibleMatched = FINDWITHLINQSTUFF; 
     //try stuff out 

     if(possibleMatches.Count == 0) 
      break; 

     //do more stuff 
    } 

    if(oldList.Any()) 
    { 
     workList = newList; 
     return true; 
    } 
} 

Так что проблема у меня здесь есть, что в моем время цикла, мне нужно проверить некоторое условие, и если это правда, я хочу продолжить со следующего итерация, так как мой весь предыдущий процесс тоже не работал.

Так как это может произойти из-за перерыва или продолжения соединения, мне нужно проверить дополнительное условие за моим пока что, которое довольно подвержено ошибкам, если я могу что-то изменить позже, не обращая внимания.

Есть contruct как

goto foreach; 

или

continue foreach; 

который продолжает со следующего внешнего цикла Еогеасп? ли это на самом деле быть жизнеспособным решением использовать Гото здесь (и увеличивающееся счетчик вручную

PS:? У вас есть лучшее решение для общей структуры настоящего Кодекса

+1

Я не уверен, правильно ли я понял проблему, но один из способов сделать это - определить переменную bool someConditionMet = false; а затем вы установите значение true внутри цикла while и проверьте его значение вне цикла while. Возможно, решение Goto может быть решением, но оно обычно не рекомендуется по соображениям удобочитаемости и, возможно, вызывает причины стека (не уверен, что это так в C#). – Husain

+0

@ Husain 'goto' вполне безопасен в C#. Читаемость ... может быть лучше с 'goto', чем с локальным. Конечно, это может сделать дальнейший рефакторинг сложнее - в частности, 'goto' не будет работать через методы (что хорошо). – Luaan

+1

Эрик Липперт обсуждает достоинства того, является ли 'продолжение' самой лучше, чем' goto' в связанных Q & A, и moreso в своем блоге, связанном с этим ответом. –

ответ

1

Если результат времени цикл должен контролировать (например, продолжить) цикл Еогеасп, его дизайн как таковой:

bool WhateverMethod() 
{ 

    //tries to find a solution for a problem 3 times 
    //in this process copies elements from old to newList 
    foreach (var tryNbr in Util.range(0,3)) 
    { 
     List<A> newList = new List<A>(); 
     List<A> oldList = workList; 

     if (Matched(oldList, newList)) 
      continue; 

     if(oldList.Any()) 
     { 
      workList = newList; 
      return true; 
     } 
    } 
} 

bool Matched(List<A> oldList, List<B> newList) 
{ 
    while(oldList.Count != 0) 
    { 
     List<A> possibleMatched = FINDWITHLINQSTUFF; 
     //try stuff out 

     if(possibleMatches.Count == 0) 
      return false; 

     //do more stuff 
    } 

    return true; // I'm assuming? 
} 

Это не рассматривается использование Гото, или вопрос «это всегда зло», но я бы предположил, что Гото " всегда "или" почти всегда "не нужен.

+1

Вам нужно изменить 'return true' на' return' в 'WhateverMethod', поскольку он возвращает void. –

+0

@ AndyNichols хороший глаз, спасибо. – clarkitect

Смежные вопросы