Операторы выбора. Справочник по C#

Следующие операторы выбирают операторы, которые нужно выполнить, из нескольких возможных вариантов на основе значения выражения:

  • Оператор if выбирает оператор, который нужно выполнить, на основе значения логического выражения.
  • Оператор 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 использует следующие шаблоны:

  • Реляционный шаблон (доступен в C# 9.0 и более поздних версиях): для сравнения результата выражения с константой.
  • Шаблон константы (доступен в C# 7.0 и более поздних версиях): чтобы проверить, равен ли результат выражения константе.

Важно!

Сведения о шаблонах, поддерживаемых оператором switch, см. в статье Шаблоны.

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

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

Примечание

Ветвь default может находиться в любом месте в операторе switch. Независимо от ее расположения ветвь 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 управление не может передаваться от одного раздела switch к следующему. Как показано в примерах этого раздела, обычно в конце каждого раздела switch используется оператор break для передачи управления из оператора switch. Вы также можете использовать операторы return и throw, чтобы передать управление из оператора switch. Чтобы имитировать такое поведение ветви и передать управление другому разделу switch, можно использовать оператор goto.

В контексте оператора можно использовать оператор 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# 7.0, оператор switch поддерживает сопоставление шаблонов. С тех пор каждая основная версия C# добавляет новые шаблоны. Дополнительные сведения см. в разделе "Шаблоны".

В C# 6 и более ранних версиях используется оператор switch со следующими ограничениями:

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

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

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

См. также