Когда использовать ключевое слово continue в C # - PullRequest
32 голосов
/ 02 ноября 2011

Недавно я проходил проект с открытым исходным кодом и, хотя я несколько лет разрабатывал в .NET, я не наткнулся на ключевое слово continue до.

Вопрос: Какие рекомендации или области могут быть полезны при использовании ключевого слова continue? Есть ли причина, по которой я не видел этого раньше?

Ответы [ 10 ]

43 голосов
/ 02 ноября 2011

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

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 вместо вложенности может сделать код более читабельным. Конечно, рефакторинг цикла и условных выражений в соответствующие методы также сделает цикл более читабельным.

15 голосов
/ 02 ноября 2011

Ключевое слово 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
12 голосов
/ 02 ноября 2011

Это предотвращает глубокое вложение.

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 может улучшить кодreadibility.Очевидно, что его следует использовать с учетом, как и любой другой языковой конструкции.

11 голосов
/ 02 ноября 2011

Когда вы не хотите 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();
}
7 голосов
/ 02 ноября 2011

Вы должны использовать это экономно.

Лучшие (= самые простые для чтения) циклы не используют break или continue, это своего рода структурированные операторы goto.

Сказав, что 1 или даже 2 оператора break / continue не сделают цикл нечитаемым, но стоит упростить их использование и упростить его.

6 голосов
/ 02 ноября 2011

В основном continue и break лучше (но часто просто замаскированы) goto операторы ...

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

Как таковые, они должны использоваться редко ... иногда они делают код очень читабельным и понятным (если альтернативой будет несколько уровней вложенности дляпример) ... большую часть времени они добавляют некоторую путаницу, похожую на goto.

4 голосов
/ 02 ноября 2011

Мое предположение относительно того, почему вы не видели этого ранее, состоит в том, что continue является своего рода двоюродным братом для goto, break и ранних return с функций. И все мы знаем, что Goto считается вредным , поэтому многие разработчики, вероятно, избегают его.

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

foreach (var v in GetSomeValues())
{
  if (ThisValueIsNotImportant(v)) continue;

  //Do important stuff with the value.
}
3 голосов
/ 02 ноября 2011

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

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;
}
3 голосов
/ 02 ноября 2011

Я что-то упустил, не используя его?

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

0 голосов
/ 07 сентября 2017

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

foreach (var element in List)
{
    if (condition1)
    {
        //do stuff .....
        continue;
    }
    if (condition2)
    {
        //do stuff ....
        continue;
    }
    .
    .
    .
    if (condition)
    {
        //do stuff ....
        continue;
    }
}

Здесь, когда выполняется любое условие оператора If, все остальные операторы if будут пропущены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...