Использование инструкции перехода с меткой (IDE0410)

Недвижимость Ценность
Идентификатор правила IDE0410
Заголовок Использование инструкции перехода с метками
Категория Style
Подкатегории Языковые правила (настройки блока кода)
Применимые языки C# 15+
Параметры csharp_style_prefer_labeled_jump_statements

Обзор

Для более ясного и лаконичного управления потоком выполнения во вложенных циклах это правило помечает код, в котором используются инструкции goto или шаблоны с логическими флагами для выхода из вложенных циклов или перехода к следующей итерации, когда вместо этого можно использовать инструкцию break или continue с меткой (C# 15+).

Правило обнаруживает следующие шаблоны:

  • Оператор goto, который переходит к метке, расположенной сразу после вложенного цикла, можно заменить на break <label>.
  • Оператор goto, который переходит к пустой метке в конце тела цикла (фактически продолжая внешний цикл), можно заменить на continue <label>.
  • Паттерн с логическим флагом, при котором переменной-флагу присваивается значение true, а затем она проверяется на каждом уровне цикла, чтобы передать break или continue на внешний уровень через вложенные циклы; его можно заменить одним помеченным break <label> или continue <label>.

Варианты

Параметры указывают поведение, которое вы хотите, чтобы правило применяло. Сведения о настройке параметров см. в разделе "Формат параметров".

csharp_style_prefer_помеченные_операторы_перехода

Недвижимость Ценность Описание
Имя параметра Стиль C#: предпочитать операторы перехода с метками
Значения параметра true Предпочитайте операторы перехода с метками
false Отключает правило
Значение параметра по умолчанию true

Example

В следующих примерах показаны три шаблона, обнаруженные этим правилом:

Goto заменен меткой останова

// Code with violations.
for (int x = 0; x < 10; x++)
{
    for (int y = 0; y < 10; y++)
    {
        if (x * y > 20)
            goto found;
    }
}

found:
Console.WriteLine("Done");

// Fixed code.
found: for (int x = 0; x < 10; x++)
{
    for (int y = 0; y < 10; y++)
    {
        if (x * y > 20)
            break found;
    }
}

Console.WriteLine("Done");

goto заменён меткой continue

// Code with violations.
for (int i = 0; i < 10; i++)
{
    for (int j = 0; j < 10; j++)
    {
        if (j == 5)
            goto next;
    }

    next: ; // The empty statement is required; a label in C# must be followed by a statement.
}

// Fixed code.
next: for (int i = 0; i < 10; i++)
{
    for (int j = 0; j < 10; j++)
    {
        if (j == 5)
            continue next;
    }
}

Шаблон флага, замененный меткой останова

// Code with violations.
bool found = false;
for (int i = 0; i < 10; i++)
{
    for (int j = 0; j < 10; j++)
    {
        if (i * j > 20)
        {
            found = true;
            break;
        }
    }

    if (found)
        break;
}

// Fixed code.
loop_i: for (int i = 0; i < 10; i++)
{
    for (int j = 0; j < 10; j++)
    {
        if (i * j > 20)
        {
            break loop_i;
        }
    }
}

Отключение предупреждений

Если вы хотите отключить только одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable IDE0410
// The code that's violating the rule is on this line.
#pragma warning restore IDE0410

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.cs]
dotnet_diagnostic.IDE0410.severity = none

Чтобы отключить все правила стиля кода, задайте уровень серьезности для категории Stylenone в файле конфигурации.

[*.cs]
dotnet_analyzer_diagnostic.category-Style.severity = none

Дополнительные сведения см. в разделе "Подавление предупреждений анализа кода".

См. также