Когда использовать ключевое слово "continue" в C#
недавно я проходил через проект с открытым исходным кодом, и хотя я разрабатывал в течение нескольких лет в .NET, я не наткнулся на continue
ключевое слово раньше.
вопрос: Каковы некоторые лучшие практики или области, которые выиграют от использования continue
ключевое слово? Есть ли причина, по которой я не видел его раньше?
10 ответов
вы используете его, чтобы немедленно выйти из текущей итерации цикла и начать следующую, Если это применимо.
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
логика внутри цикла. А continue
вместо вложенности может сделать код более читаемым. Из конечно, рефакторинг цикла и условных обозначений в соответствующие методы также сделает цикл более читаемым.
на 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
когда вы не хотите 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();
}
это предотвращает глубокое гнездование.
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
может улучшить читаемость кода. Очевидно, что его следует использовать с учетом, как и любую другую языковую конструкцию.
вы должны использовать его экономно.
лучшие (=самые простые для чтения) петли не используют break
или continue
, они являются своего рода структурированные операторы goto.
сказав это, 1 или даже 2 оператора break/continue не сделают цикл нечитаемым, но он платит, чтобы сделать их использование понятным и сохранить его простым.
в принципе continue
и break
лучше (но часто просто замаскированы)goto
заявления...
всякий раз, когда вы находитесь внутри цикла И знаете, что все следующее внутри цикла должно быть пропущено и продолжено со следующей итерацией, которую вы можете использовать continue
...
как таковые они должны использоваться seldomn... иногда они делают код очень читаемым и понятным (если альтернативой будет несколько уровней вложенности, например)... большую часть времени они добавляют некоторые путаница похожа на goto
.
мое предположение о том, почему вы не видели его раньше, это continue
является своего рода кузеном goto
, break
и начале return
s от функций. И мы все знаем, что Гото считается вредным, поэтому многие разработчики, вероятно, склонны избегать этого.
для меня, я предпочитаю использовать continue
когда я хочу очистить цикл, где могут быть некоторые значения, которые меня не волнуют. Используя continue
Я могу пропустить эти значения, не заключая" важную " логику в моем цикле в вложенный if
.
foreach (var v in GetSomeValues())
{
if (ThisValueIsNotImportant(v)) continue;
//Do important stuff with the value.
}
Я пропустил что-нибудь, не используя его?
Это кажется странным вопрос. По-видимому, вы лучше, чем кто-либо другой, знаете, нужно ли начинать следующую итерацию цикла раньше.
подумайте об этом как о "возврате", но применимом только к контексту цикла. Общим примером является машина состояний, циклически охватывающая все доступные входные данные.
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;
}
вы можете использовать оператор continue для оптимизации кода. когда вы уверены, что из всех условий, atmost одно условие будет соответствовать. вы можете использовать его как ниже
foreach (var element in List)
{
if (condition1)
{
//do stuff .....
continue;
}
if (condition2)
{
//do stuff ....
continue;
}
.
.
.
if (condition)
{
//do stuff ....
continue;
}
}
здесь, когда выполняется любое условие оператора If, остальные операторы if будут пропущены.