Операторы выбора — 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!"); >>
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 "); >
Операторы 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: "); > else if (char.IsLower(ch)) < Console.WriteLine($"A lowercase letter: "); > else if (char.IsDigit(ch)) < Console.WriteLine($"A digit: "); > else < Console.WriteLine($"Not alphanumeric character: "); > >
В контексте выражения можно использовать условный оператор ?: для вычисления одного из двух выражений на основе значения логического выражения.
Инструкция 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 ; too low."); break; case > 15.0: Console.WriteLine($"Measured value is ; too high."); break; case double.NaN: Console.WriteLine("Failed measurement."); break; default: Console.WriteLine($"Measured value is ."); 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 ; out of an acceptable range."); break; default: Console.WriteLine($"Measured value is ."); 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 ."); break; case (> 0, > 0): Console.WriteLine($"First measurement is , second measurement is ."); break; default: Console.WriteLine("One or both measurements are not valid."); break; > >
В предыдущем примере используются шаблоны положений со вложенными шаблонами отношений.
Спецификация языка C#
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:
См. также
- справочник по C#
- Условный оператор ?:
- Логические операторы
- Шаблоны
- Выражение switch
- Добавление отсутствующих случаев для переключения инструкции (правило стиля IDE0010)
?: оператор — тернарный условный оператор
Условный оператор ?: , также называемый тернарным, вычисляет логическое выражение и в зависимости от полученного значения true или false возвращает результат одного из двух соответствующих выражений, как показано в следующем примере.
string GetWeatherDisplay(double tempInCelsius) => tempInCelsius < 20.0 ? "Cold." : "Perfect!"; Console.WriteLine(GetWeatherDisplay(15)); // output: Cold. Console.WriteLine(GetWeatherDisplay(27)); // output: Perfect!
Как показано в предыдущем примере, синтаксис условного оператора выглядит следующим образом.
condition ? consequent : alternative
Выражение condition должно принимать значение true или false . Если condition принимает значение true , вычисляется выражение consequent , а результат становится результатом операции. Если condition принимает значение false , вычисляется выражение alternative , а результат становится результатом операции. Вычисляется только выражение consequent или alternative . Условные выражения являются целевыми типами. Это значит, что если известен целевой тип условного выражения, типы consequent и alternative должны быть неявно преобразованы в целевой тип, как показано в следующем примере:
var rand = new Random(); var condition = rand.NextDouble() > 0.5; int? x = condition ? 12 : null; IEnumerable xs = x is null ? new List() < 0, 1 >: new int[] < 2, 3 >;
Если целевой тип условного выражения неизвестен (например, при использовании var ключевое слово) или типа consequent и alternative должен быть тот же или неявное преобразование одного типа в другой:
var rand = new Random(); var condition = rand.NextDouble() > 0.5; var x = condition ? 12 : (int?)null;
Условный оператор имеет правую ассоциативность, то есть выражение формы.
a ? b : c ? d : e
a ? b : (c ? d : e)
Вы можете использовать следующий мнемонический прием, чтобы запомнить, как оценивается условный оператор:
is this condition true ? yes : no
Условное выражение REF
Условное выражение ссылочного выражения условно возвращает ссылку на переменную, как показано в следующем примере:
int[] smallArray = [1, 2, 3, 4, 5]; int[] largeArray = [10, 20, 30, 40, 50]; int index = 7; ref int refValue = ref ((index < 5) ? ref smallArray[index] : ref largeArray[index - 5]); refValue = 0; index = 2; ((index < 5) ? ref smallArray[index] : ref largeArray[index - 5]) = 100; Console.WriteLine(string.Join(" ", smallArray)); Console.WriteLine(string.Join(" ", largeArray)); // Output: // 1 2 100 4 5 // 10 20 0 40 50
Вы можете ref назначить результат условного ссылочного выражения, использовать его в качестве возвращаемого ссылки или передать его в качестве параметра метода , in out или ref readonly в качестве ref параметра метода. Вы также можете назначить результат условного выражения ссылок, как показано в предыдущем примере.
Для условного выражения REF используется следующий синтаксис:
condition ? ref consequent : ref alternative
Как и условный оператор, выражение условного ссылок оценивает только одно из двух выражений: либо consequent alternative .
В выражении условного consequent ссылок тип и alternative должен быть одинаковым. Условные выражения ссылок не являются целевыми типами.
Условный оператор и оператор if
Если использовать условный оператор вместо оператора if , может получиться более лаконичный код в случаях, когда необходимо условно вычислить значение. В следующем примере иллюстрируются два вида классификации целого числа как положительного или отрицательного:
int input = new Random().Next(-5, 5); string classify; if (input >= 0) < classify = "nonnegative"; >else < classify = "negative"; >classify = (input >= 0) ? "nonnegative" : "negative";
Возможность перегрузки оператора
Определяемый пользователем тип не может перегружать условный оператор.
Спецификация языка C#
Спецификации новых функций:
См. также
- Упрощение условного выражения (правило стиля IDE0075)
- справочник по C#
- Операторы и выражения C#
- Оператор if
- ?. И? Операторы []
- ?? и ??= — операторы
- Ключевое слово ref
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
The .NET documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
Как работает if в си шарп
Условные конструкции - один из базовых компонентов многих языков программирования, которые направляют работу программы по одному из путей в зависимости от определенных условий. Одной из таких конструкций в языке программирования C# является конструкция if..else
Конструкция if/else проверяет истинность некоторого условия и в зависимости от результатов проверки выполняет определенный код.
Ее простейшая форма состоит из блока if :
if(условие)
После ключевого слова if ставится условие. Условие должно представлять значение типа bool . Это может быть непосредственно значение типа bool или результат условного выражения или другого выражения, которое возвращает значение типа bool . И если это условие истинно (равно true ), то срабатывает код, который помещен далее после условия внутри фигурных скобок.
int num1 = 8; int num2 = 6; if(num1 > num2) < Console.WriteLine($"Число больше числа "); >
В данном случае у нас первое число больше второго, поэтому выражение num1 > num2 истинно и возвращает true , следовательно, управление переходит к строке Console.WriteLine("Число больше числа ");
Если блок if содержит одну инструкцию, то мы можем его сократить, убрав фигурные скобки:
int num1 = 8; int num2 = 6; if (num1 > num2) Console.WriteLine($"Число больше числа "); // или так if (num1 > num2) Console.WriteLine($"Число больше числа ");
Также мы можем соединить сразу несколько условий, используя логические операторы:
int num1 = 8; int num2 = 6; if(num1 > num2 && num1==8) < Console.WriteLine($"Число больше числа "); >
В данном случае блок if будет выполняться, если num1 > num2 равно true и num1==8 равно true .
Выражение else
Но что, если мы захотим, чтобы при несоблюдении условия также выполнялись какие-либо действия? В этом случае мы можем добавить блок else :
int num1 = 8; int num2 = 6; if(num1 > num2) < Console.WriteLine($"Число больше числа "); > else < Console.WriteLine($"Число меньше числа "); >
Блок else выполняется, если условие после if ложно, то есть равно false . Если блок else содержит толко одну инструкцию, то оять же мы можем его сократить, убрав фигурные скобки:
int num1 = 8; int num2 = 6; if(num1 > num2) Console.WriteLine($"Число больше числа "); else Console.WriteLine($"Число меньше числа ");
else if
Но в примере выше при сравнении чисел мы можем насчитать три состояния: первое число больше второго, первое число меньше второго и числа равны. Используя конструкцию else if , мы можем обрабатывать дополнительные условия:
int num1 = 8; int num2 = 6; if(num1 > num2) < Console.WriteLine($"Число больше числа "); > else if (num1 < num2) < Console.WriteLine($"Число меньше числа "); > else
При необходимости можно добавить несколько выражений else if :
string name = "Alex"; if (name == "Tom") Console.WriteLine("Вас зовут Tomas"); else if (name == "Bob") Console.WriteLine("Вас зовут Robert"); else if (name == "Mike") Console.WriteLine("Вас зовут Michael"); else Console.WriteLine("Неизвестное имя");
Тернарная операция
Тернарную операция также позволяет проверить некоторое условие и в зависимости от его истинности выполнить некоторые действия. Она имеет следующий синтаксис:
[первый операнд - условие] ? [второй операнд] : [третий операнд]
Здесь сразу три операнда. В зависимости от условия тернарная операция возвращает второй или третий операнд: если условие равно true , то возвращается второй операнд; если условие равно false , то третий. Например:
int x=3; int y=2; int z = x < y ? (x+y) : (x-y); Console.WriteLine(z); // 1
Результат тернарной операции (то есть второй или третий операнд в зависимости от условия) присваивается переменной z.
Урок #5 – Условные операторы (if-else)
Все языки программирования содержат условную конструкцию. В уроке мы научимся использовать оператор if-else и научимся создавать условия. Также в видео мы сделаем мини игру на основе условных операторов.
Видеоурок
Условные операторы очень важны, ведь они позволяют выполнять разный код в зависимости от исхода условия. В языке C# существует три конструкции позволяющих осуществлять проверку.
В уроке мы рассмотрим лишь две из них.
Конструкция if - else
За счёт if else можно проверить одно или несколько условий и в случае их успешной проверки будет выполнен один, иначе другой.
int a = 2, b = 10; if (a == b) < // Если a будет равным b, тогда будет выполнен код // Здесь код который будет выполнен // Если все одна строка кода, то фигурные скобки <>// можно не ставить > else if (a else < // Этот код сработает, если другие условия не будет выполнено >
Вы можете прописать структуру лишь с одним условием if , а можете дописать в неё сколько-угодно вложенных условий else if .
Внутри каждого из условий можно прописывать другие конструкции if else, что будут проверять новые выражения.
Если необходимо проверить несколько условий в одном операторе, то можно воспользоваться логическим «и» или же логическим «или»:
if (a != b && a > b) < // Код будет выполнен, если и первое, и второе условие // окажутся верными >if (a < b || a == b) < // Код будет выполнен, если или первое, или второе условие // окажется верным >
Тернарная операция
Это сокращенная форма if else . Записывается следующим образом:
int x = 90, a = 8; int res = x < a ? (x + a) : (x - a); Console.WriteLine (res);
Мы проверяем, если "x" будет меньше за "a", то мы в переменную res устанавливаем их сумму, иначе - их разницу.
Весь код будет доступен после подписки на проект!
Задание к уроку
Необходимо оформить подписку на проект, чтобы получить доступ ко всем домашним заданиям
Большое задание по курсу
Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца
