Концепция заключается в том, чтобы разрешить использование нескольких операторов `break` и опционального оператора `continue` в одной строке, как показано ниже:
while (cond1) // возврат сюда из: break, continue
{
while (cond2)
{
if (cond3)
{
break, break; // выход из внутреннего и внешнего цикла
}
else if (cond4)
{
break, continue; // выход из внутреннего цикла и продолжение во внешнем цикле
}
}
// этот код выполняется только если !cond2
}
// код выполнен после "break, break" или если !cond1
while (cond1) // возврат сюда из: break, continue
{
switch (item)
{
case value1:
break, break; // выход из switch и внешнего цикла
case value2:
break, continue; // выход из switch и продолжение во внешнем цикле
default:
break;
}
// этот код выполняется только если был default
}
// код выполнен после "break, break" или если !cond1
Операторы `break` могут завершать выполнение циклов или блоков `switch case`. Количество операторов `break` ограничено количеством вложенных областей, из которых можно выйти, тогда как оператор `continue` может быть только один и должен быть последним в последовательности.
Формальное определение (subj):
break [, break]... [, continue]
Это означает, что внутри блока кода могут использоваться несколько операторов `break` и опционально `continue` в конце. Ни один из них не обязателен, что обеспечивает полную обратную совместимость.
Обычно альтернативы этому подходу включают управление несколькими флагами, подобное конечному автомату, распределённому между локальными переменными, а также множество операторов `if`, чтобы обработать условия в нужном месте. Это может усложнить как код, так и его читаемость.
Кроме того, поскольку каждый оператор (`break`, `continue`) является отдельным словом, они могут подсвечиваться в IDE, показывая свою связь с соответствующим блоком (`for`, `foreach`, `while`, `switch`, `do`). Во время отладки эти операторы могут выполняться по одному, подобно тому, как выполняется код внутри `for (statements)`, с независимой подсветкой каждой части строки.
Если вам знакома эта боль, приглашаю поддержать на:
https://github.com/dotnet/csharplang/discussions/8434 (стрелкой вверх)