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