Looking for c# Keywords? Try Ask4Keywords

C# Language перерыв


пример

В цикле (foreach, do, while, while) оператор break прерывает выполнение самого внутреннего цикла и возвращает его после кода. Также он может использоваться с yield в котором он указывает, что итератор подходит к концу.

for (var i = 0; i < 10; i++)
{
    if (i == 5)
    {
        break;
    }
    Console.WriteLine("This will appear only 5 times, as the break will stop the loop.");
}

Живая демонстрация на .NET скрипке

foreach (var stuff in stuffCollection)
{
    if (stuff.SomeStringProp == null)
        break;
    // If stuff.SomeStringProp for any "stuff" is null, the loop is aborted.
    Console.WriteLine(stuff.SomeStringProp);
}

Оператор break также используется в конструкциях case-case для выхода из сегмента или сегмента по умолчанию.

switch(a)
{
    case 5:
        Console.WriteLine("a was 5!");
        break;

    default:
        Console.WriteLine("a was something else!");
        break;
}

В операторах switch ключевое слово break используется в конце каждого оператора case. Это противоречит некоторым языкам, которые позволяют «проваливаться» к следующему описанию случая в серии. Обходные пути для этого включают в себя операторы «goto» или стекирование операторов «case» последовательно.

Следующий код даст числа 0, 1, 2, ..., 9 и последняя строка не будет выполнена. yield break означает конец функции (а не только цикл).

public static IEnumerable<int> GetNumbers()
{
    int i = 0;
    while (true) {
        if (i < 10) {
            yield return i++;
        } else {
            yield break;
        }
    }
    Console.WriteLine("This line will not be executed");
}

Живая демонстрация на .NET скрипке

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

foreach (var outerItem in outerList)
{
    foreach (var innerItem in innerList)
    {
        if (innerItem.ShoudBreakForWhateverReason)
            // This will only break out of the inner loop, the outer will continue:
            break; 
    }
}

Если вы хотите выйти из внешнего цикла здесь, вы можете использовать одну из нескольких различных стратегий, таких как:

  • Оператор goto выпрыгивает из всей структуры цикла.
  • Специфическая переменная флага ( shouldBreak в следующем примере), которая может быть проверена в конце каждой итерации внешнего цикла.
  • Рефакторинг кода для использования оператора return в самом внутреннем цикле цикла или вообще полностью исключить всю структуру вложенных циклов.
bool shouldBreak = false;
while(comeCondition)
{
    while(otherCondition)
    {
        if (conditionToBreak)
        {
            // Either tranfer control flow to the label below...
            goto endAllLooping;

            // OR use a flag, which can be checked in the outer loop:
            shouldBreak = true;
        }
    }

    if(shouldBreakNow)
    {
        break; // Break out of outer loop if flag was set to true
    }
}

endAllLooping: // label from where control flow will continue