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


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

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

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

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

Подсказка

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

Инструкция 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.

Это важно

Каждый раздел коммутатора должен заканчиваться элементом break, gotoили return. Переход от одного раздела коммутатора к следующему приводит к ошибке компилятора. Однако можно применить несколько меток коммутатора к одному разделу коммутатора, как 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#.

См. также