Когда использовать ключевое слово "продолжить" в С#
Недавно я проходил проект с открытым исходным кодом, и хотя я развивался уже несколько лет в .NET, я не наткнулся на continue
.
Вопрос: Каковы некоторые лучшие практики или области, которые выиграют от использования ключевого слова continue
? Есть ли причина, по которой я, возможно, раньше этого не видел?
Ответы
Ответ 1
Вы используете его для немедленного выхода из текущей итерации цикла и начинаете следующее, если это применимо.
foreach (var obj in list)
{
continue;
var temp = ...; // this code will never execute
}
A continue
обычно привязывается к условию, и условие обычно можно использовать вместо continue
;
foreach (var obj in list)
{
if (condition)
continue;
// code
}
Можно просто написать как
foreach (var obj in list)
{
if (!condition)
{
// code
}
}
continue
становится более привлекательным, если в цикле может быть несколько уровней вложенной логики if
. A continue
вместо вложенности может сделать код более читаемым. Конечно, рефакторинг цикла и условных выражений в соответствующие методы также сделает цикл более удобочитаемым.
Ответ 2
Ключевое слово continue
используется для пропущения остальной части цикла и продолжения. Например:
for(int i = 0; i < 5; i++)
{
if(i == 3) continue; //Skip the rest of the block and continue the loop
Console.WriteLine(i);
}
Будет напечатан:
0
1
2
4
Ответ 3
Если вы не хотите, чтобы break
вышел из цикла, но вы хотите следующую итерацию:
for (int i = 0; i < something; i++)
{
if (condition)
continue;
// expensive calculations, skip due to continue
// or due to the condition above I don't want to
// run the following code
stuff();
code();
}
Ответ 4
Он предотвращает глубокое вложение.
foreach(var element in collection)
{
doSomething();
doSomethingElse();
if (condition1)
{
action1();
action2();
if (condition2)
{
action3();
}
}
}
можно переписать как
foreach(var element in collection)
{
doSomething();
doSomethingElse();
if (!condition1)
{
continue;
}
action1();
action2();
if (!condition2)
{
continue;
}
action3();
}
Если кодовые блоки не являются тривиальными, но по вертикали больше, использование continue
может улучшить читаемость кода. Очевидно, его следует использовать с учетом, как и любой другой языковой конструкции.
Ответ 5
Вы должны использовать его экономно.
Лучшие (= наиболее простые для чтения) циклы не используют break
или continue
, это своего рода структурированные операторы goto.
Сказав, что 1 или даже 2 оператора break/continue не делают цикл нечитаемым, но он платит, чтобы сделать их использование понятным и сохранить его простым.
Ответ 6
В основном continue
и break
лучше (но часто просто замаскированы) goto
statements...
Всякий раз, когда вы находитесь внутри цикла и знаете, что все, что должно быть дальше в цикле, должно быть пропущено и продолжено со следующей итерацией, вы можете использовать continue
...
Как таковые, они должны использоваться редко... иногда они делают код очень понятным и понятным (если альтернативой будет несколько уровней вложенности, например)... большую часть времени они добавляют некоторую путаницу, похожую на goto
.
Ответ 7
Мое предположение о том, почему вы раньше этого не видели, заключается в том, что continue
является своего рода кузеном для goto
, break
и ранних return
от функций. И все мы знаем, что Goto считается вредным, поэтому многие разработчики, вероятно, склонны его избегать.
Для меня я предпочитаю использовать continue
, когда хочу очистить цикл, где могут быть некоторые значения, которые меня не волнуют. Используя continue
, я могу пропустить эти значения без включения "важной" логики в моем цикле во вложенном if
.
foreach (var v in GetSomeValues())
{
if (ThisValueIsNotImportant(v)) continue;
//Do important stuff with the value.
}
Ответ 8
Я пропустил что-нибудь, не используя его?
Это кажется странным вопросом. Предположительно, вы знаете, лучше, чем кто-либо другой, нужно ли вам сначала начать следующую итерацию цикла.
Ответ 9
Подумайте об этом как о "возврате", но применим только к контексту цикла.
Общим примером является конечный автомат, охватывающий весь доступный вход.
while(!SomeQueue.Empty)
{
byte nextByte = SomeQueue.Dequeue();
switch State:
{
case A:
if(nextByte == Condition)
{
State = B;
}
else
{
State = ParseError;
}
continue;
case B:
//Test nextByte
State = C;
continue;
case C:
//Test nextByte
State = A;
continue;
case ParseError:
//Do something for this condition
State = A;
continue;
}
Ответ 10
Вы также можете использовать оператор continue для оптимизации кода. когда вы уверены, что из всех условий будет достигнуто самое близкое условие. вы можете использовать его, как показано ниже,
foreach (var element in List)
{
if (condition1)
{
//do stuff .....
continue;
}
if (condition2)
{
//do stuff ....
continue;
}
.
.
.
if (condition)
{
//do stuff ....
continue;
}
}
Здесь, когда выполняется какое-либо из условий оператора If, остальные команды if будут пропущены.