Обновить

Labeled break and continue в C# 15 — разбор плохого примера и поиск реального кейса

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели9K
Всего голосов 9: ↑7 и ↓2+6
Комментарии7

Комментарии 7

Не знаю, насколько это актуально для C#, но непосредственно вложенные циклы обычно компилируются в более эффективный код.

А вся конструкция взята из Фортрана.

Хотя вообще прерывать внутренний цикл не очень хорошо с точки зрения конвейеризации.

Никогда не было у меня такой необходимости, но удивлен что в c# этого не было, хотя оно есть в js.

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

Честно говоря, второй (новый) способ мне кажется достаточно легко читаемым. Но конструкция очень специфическая, тут согласен

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

string foundValue = null;
bool shouldBreak = false;

for (int x = 0; x < xMax; x++)
{
    for (int y = 0; y < yMax; y++)
    {
        foundValue = GetValue(x, y);
        if (foundValue == targetValue)
        {
            goto Exit;
        }
    }
}
Exit: ProcessValue(foundValue);

Что лаконично, читаемо и понятно. Более того использование goto для выхода из вложенных циклов предлагается в документации по C# от MS. Аналогично с выходом из switch в том же разделе показано использование goto для этого и для перехода в отдельно взятый case.

Проблема и преимущество goto это возможность прыгнуть куда угодно, а не только выйти из цикла.

А здесь мы ограничиваем себя и упрощаем понимание кода.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации