Подтвердить что ты не робот

Когда использовать ключевое слово "продолжить" в С#

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

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

4b9b3361

Ответ 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 будут пропущены.