Операторы выделения — if
, if-else
и switch
Операторы if
, if-else
и switch
выбирают операторы для выполнения из множества возможных путей на основе значения выражения. Оператор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
использует следующие шаблоны:
- Реляционный шаблон (доступный в C# 9.0 и более поздних версиях): для сравнения результата выражения с константой.
- Шаблон константы: проверьте, равен ли результат выражения константе.
Важно!
Сведения о шаблонах, поддерживаемых оператором switch
, см. в статье Шаблоны.
В предыдущем примере также показана ветвь default
. Ветвь default
указывает операторы, которые нужно выполнить, если выражение не соответствует ни одному другому шаблону. Если выражение соответствия не соответствует ни одному шаблону регистра, а регистр отсутствует default
, управление выполняется switch
через оператор .
Оператор switch
выполняет список операторов в первом разделе switch, шаблон ветви которого соответствует выражению соответствия, а условие ветви, если оно есть, равно true
. Оператор switch
оценивает шаблоны ветвей в порядке, в котором они указаны в коде, сверху вниз. Компилятор создает ошибку, если оператор switch
содержит недостижимую ветвь. Это ветвь, которая уже была обработана в верхнем регистре или шаблон которой невозможно сопоставить.
Примечание
Ветвь default
может находиться в любом месте в операторе switch
. Независимо от его положения, регистр оценивается только в том случае, default
если все остальные шаблоны регистра не совпадают или goto default;
инструкция выполняется в одном из разделов switch.
Можно указать несколько шаблонов ветвей для одного раздела оператора 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 используется оператор 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#
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:
Дополнительные сведения о шаблонах см. в разделе Шаблоны и сопоставление шаблоновспецификации языка C#.