Поделиться через


Операторы выбора — if, if-elseи switch

if-else switch Операторы ifвыбора и инструкции для выполнения из множества возможных путей на основе значения выражения. Оператор if выполняет инструкцию только в том случае, если заданное логическое выражение вычисляется true. Оператор if-else позволяет выбрать, какие из двух путей кода следует выполнять на основе логического выражения. Оператор switch выбирает список инструкций для выполнения на основе сопоставления шаблона с выражением.

Инструкция if

Оператор if может быть любой из следующих двух форм:

  • Оператор if с else частью выбирает одну из двух инструкций для выполнения на основе значения логического выражения, как показано в следующем примере:

    DisplayWeatherReport(15.0);  // Output: Cold.
    DisplayWeatherReport(24.0);  // Output: Perfect!
    
    void DisplayWeatherReport(double tempInCelsius)
    {
        if (tempInCelsius < 20.0)
        {
            Console.WriteLine("Cold.");
        }
        else
        {
            Console.WriteLine("Perfect!");
        }
    }
    
  • Оператор if без else части выполняет его тело только в том случае, если логическое выражение оценивается trueкак показано в следующем примере:

    DisplayMeasurement(45);  // Output: The measurement value is 45
    DisplayMeasurement(-3);  // Output: Warning: not acceptable value! The measurement value is -3
    
    void DisplayMeasurement(double value)
    {
        if (value < 0 || value > 100)
        {
            Console.Write("Warning: not acceptable value! ");
        }
    
        Console.WriteLine($"The measurement value is {value}");
    }
    

Вы можете вложить if инструкции для проверки нескольких условий, как показано в следующем примере:

DisplayCharacter('f');  // Output: A lowercase letter: f
DisplayCharacter('R');  // Output: An uppercase letter: R
DisplayCharacter('8');  // Output: A digit: 8
DisplayCharacter(',');  // Output: Not alphanumeric character: ,

void DisplayCharacter(char ch)
{
    if (char.IsUpper(ch))
    {
        Console.WriteLine($"An uppercase letter: {ch}");
    }
    else if (char.IsLower(ch))
    {
        Console.WriteLine($"A lowercase letter: {ch}");
    }
    else if (char.IsDigit(ch))
    {
        Console.WriteLine($"A digit: {ch}");
    }
    else
    {
        Console.WriteLine($"Not alphanumeric character: {ch}");
    }
}

В контексте выражения можно использовать условный оператор ?: для вычисления одного из двух выражений на основе значения логического выражения.

Инструкция switch

Оператор switch выбирает список инструкций для выполнения на основе сопоставления шаблона с выражением сопоставления, как показано в следующем примере:

DisplayMeasurement(-4);  // Output: Measured value is -4; too low.
DisplayMeasurement(5);  // Output: Measured value is 5.
DisplayMeasurement(30);  // Output: Measured value is 30; too high.
DisplayMeasurement(double.NaN);  // Output: Failed measurement.

void DisplayMeasurement(double measurement)
{
    switch (measurement)
    {
        case < 0.0:
            Console.WriteLine($"Measured value is {measurement}; too low.");
            break;

        case > 15.0:
            Console.WriteLine($"Measured value is {measurement}; too high.");
            break;

        case double.NaN:
            Console.WriteLine("Failed measurement.");
            break;

        default:
            Console.WriteLine($"Measured value is {measurement}.");
            break;
    }
}

В предыдущем примере switch инструкция использует следующие шаблоны:

Это важно

Сведения о шаблонах, поддерживаемых инструкцией switch , см. в разделе "Шаблоны".

В предыдущем примере также показано, как default это происходит. В default этом случае указываются операторы для выполнения, если выражение совпадения не соответствует другому шаблону регистра. Если выражение совпадения не соответствует ни одному шаблону регистра, и нет default регистра, элемент управления попадает через инструкцию switch .

Оператор switch выполняет список инструкций в первом разделе коммутатора , шаблон регистра которого соответствует выражению соответствия и если он присутствует, оценивается true. Оператор switch вычисляет шаблоны регистра в порядке текста сверху вниз. Компилятор создает ошибку, когда switch инструкция содержит неподдерживаемый случай. Это случай, который уже обрабатывается верхним регистром или шаблоном которого невозможно соответствовать.

Замечание

Регистр default может отображаться в любом месте в операторе switch . Независимо от его положения, регистр вычисляется только в том случае, default если все остальные шаблоны регистра не совпадают или goto default; оператор выполняется в одном из разделов коммутатора.

Можно указать несколько шаблонов регистра для одного раздела switch инструкции, как показано в следующем примере:

DisplayMeasurement(-4);  // Output: Measured value is -4; out of an acceptable range.
DisplayMeasurement(50);  // Output: Measured value is 50.
DisplayMeasurement(132);  // Output: Measured value is 132; out of an acceptable range.

void DisplayMeasurement(int measurement)
{
    switch (measurement)
    {
        case < 0:
        case > 100:
            Console.WriteLine($"Measured value is {measurement}; out of an acceptable range.");
            break;
        
        default:
            Console.WriteLine($"Measured value is {measurement}.");
            break;
    }
}

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

Это важно

Каждый раздел коммутатора должен заканчиваться или breakgotoreturn. Переход от одного раздела коммутатора к следующему приводит к ошибке компилятора. Однако к одному разделу коммутатора можно применить несколько меток коммутатора, как case < 0: и в приведенном выше примере. Этот преднамеренный выбор проектирования позволяет кратко обрабатывать несколько случаев, которые совместно используют одну или взаимозависимость логики.

В контексте выражения можно использовать switch выражение для вычисления одного выражения из списка потенциальных выражений на основе сопоставления шаблона с выражением.

Это важно

Различия между выражением коммутатора и оператором switch:

  • Оператор switch используется для управления потоком выполнения в блоке кода.
  • Выражение switch обычно используется в контекстах возвращаемого значения и назначения значений, часто в качестве элементов с выражением.
  • Раздел регистра выражения коммутатора не может быть пустым, оператор switch может.

Охранники дела

Шаблон регистра может быть недостаточно экспрессивным, чтобы указать условие для выполнения раздела коммутатора. В таком случае можно использовать защиту регистра. Это дополнительное условие, которое должно быть удовлетворено вместе с соответствующим шаблоном. Охранник регистра должен быть логическим выражением. Вы указываете защиту регистра после ключевого when слова, следующего за шаблоном, как показано в следующем примере:

DisplayMeasurements(3, 4);  // Output: First measurement is 3, second measurement is 4.
DisplayMeasurements(5, 5);  // Output: Both measurements are valid and equal to 5.

void DisplayMeasurements(int a, int b)
{
    switch ((a, b))
    {
        case (> 0, > 0) when a == b:
            Console.WriteLine($"Both measurements are valid and equal to {a}.");
            break;

        case (> 0, > 0):
            Console.WriteLine($"First measurement is {a}, second measurement is {b}.");
            break;

        default:
            Console.WriteLine("One or both measurements are not valid.");
            break;
    }
}

В предыдущем примере используются позиционные шаблоны с вложенными реляционными шаблонами.

Спецификация языка C#

Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:

Дополнительные сведения о шаблонах см. в разделе "Шаблоны" и "Сопоставление шаблонов " спецификации языка C#.

См. также