Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Операторы выбора —
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.
Это важно
Каждый раздел коммутатора должен заканчиваться или breakgotoreturn. Переход от одного раздела коммутатора к следующему приводит к ошибке компилятора. Однако к одному разделу коммутатора можно применить несколько меток коммутатора, как 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#.