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