Когда использовать ключевое слово "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 и начале returns от функций. И мы все знаем, что Гото считается вредным, поэтому многие разработчики, вероятно, склонны избегать этого.

для меня, я предпочитаю использовать 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 будут пропущены.