- Тернарный оператор ?: в C#
- Почему тернарный
- Синтаксис
- Как работает
- Пример. Определяем, является ли число четным
- Когда лучше использовать
- Тернарный оператор си шарп
- Выражение else
- else if
- Тернарная операция
- ?: оператор — тернарный условный оператор
- Условное выражение REF
- Условный оператор и оператор if
- Возможность перегрузки оператора
- Спецификация языка C#
- См. также
- ?: operator - the ternary conditional operator
- Conditional ref expression
- Conditional operator and an if statement
- Operator overloadability
- C# language specification
- See also
Тернарный оператор ?: в C#
Тернарный оператор — аналог условной конструкции if. else . Если вы еще не знакомы с оператором условия if , советуем сначала познакомиться с ним.
Почему тернарный
В C# существует три вида операторов:
1. Унарные операторы работают с одним операндом. Например, оператор — — унарный: из значения 7 он может сделать значение -7 .
2. Бинарные операторы работают с двумя операторами. Например, оператор сложения + может сложить два числа: 2 + 5 .
3. Тернарные операторы работают с тремя операторами.
Синтаксис
Условие ? Выражение1 : Выражение2;
Как работает
- Если Условие = true , оператор возвращает Выражение1 .
- Если Условие = false , оператор возвращает Выражение2 .
С помощью тернарного оператора можно укоротить этот код:
На языке тернарного оператора он будет выглядеть так:
isEven = (number % 2 == 0) ? true : false;
Пример. Определяем, является ли число четным
using System; namespace Conditional < class Ternary < public static void Main(string[] args) < int number = 2; bool isEven; isEven = (number % 2 == 0) ? true : false ; Console.WriteLine(isEven); >> >
Что здесь происходит
1. Сначала мы присваиваем переменной number значение 2 .
2. Затем мы с помощью тернарного оператора проверяем, является ли число четным — это Условие .
3. Число 2 — четное, поэтому условие (number % 2 == 0) вернет true — это Выражение1 .
4. Результат записывается в переменную isEven .
Примечание. Тернарный оператор также может возвращать числа, строки символы.
Совет. Вместо того чтобы хранить возвращаемые значения в переменной isEven , можно сразу выводить их на экран. Так эффективнее. Например:
Console.WriteLine((number % 2 == 0) ? true : false);
Когда лучше использовать
Тернарный оператор позволяет заменить несколько строк кода всего лишь одной. Но злоупотреблять им не стоит.
Например, мы можем заменить условную конструкцию if..else if :
result = a > b ? "a больше, чем b" : a < b ? "b больше, чем a" : "a равно b";
Тернарный оператор уменьшает длину кода, но ухудшает понимание логики программы.
Поэтому тернарный оператор лучше использовать только для замены простых конструкций if. else .
СodeСhick.io - простой и эффективный способ изучения программирования.
2023 © ООО "Алгоритмы и практика"
Тернарный оператор си шарп
Условные конструкции - один из базовых компонентов многих языков программирования, которые направляют работу программы по одному из путей в зависимости от определенных условий. Одной из таких конструкций в языке программирования C# является конструкция if..else
Конструкция if/else проверяет истинность некоторого условия и в зависимости от результатов проверки выполняет определенный код.
Ее простейшая форма состоит из блока 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 , то третий. Например:
Результат тернарной операции (то есть второй или третий операнд в зависимости от условия) присваивается переменной z.
?: оператор — тернарный условный оператор
Условный оператор ?: , также называемый тернарным, вычисляет логическое выражение и в зависимости от полученного значения 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 .
Начиная с C# 9.0 условные выражения имеют целевой тип. Это значит, что если известен целевой тип условного выражения, типы 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;
Условный оператор имеет правую ассоциативность, то есть выражение формы.
Вы можете использовать следующий мнемонический прием, чтобы запомнить, как оценивается условный оператор:
is this condition true ? yes : no
Условное выражение REF
Ссылочной переменной можно назначить условно с помощью условного выражения ref. Кроме того, условное выражение REF можно использовать как возвращаемое ссылочное значение или как аргумент метода ref .
Для условного выражения REF используется следующий синтаксис:
condition ? ref consequent : ref alternative
Подобно исходному условному оператору, условное выражение REF вычисляет только одно из двух выражений: consequent или alternative .
В выражении условной ссылки тип consequent и alternative должен быть одинаковым. Выражения условной ссылки не являются целевыми.
В следующем примере иллюстрируется использование условного выражения REF:
var smallArray = new int[] < 1, 2, 3, 4, 5 >; var largeArray = new int[] < 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
Условный оператор и оператор 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#
Спецификации для новых функций:
См. также
?: operator - the ternary conditional operator
The conditional operator ?: , also known as the ternary conditional operator, evaluates a Boolean expression and returns the result of one of the two expressions, depending on whether the Boolean expression evaluates to true or false , as the following example shows:
string GetWeatherDisplay(double tempInCelsius) => tempInCelsius < 20.0 ? "Cold." : "Perfect!"; Console.WriteLine(GetWeatherDisplay(15)); // output: Cold. Console.WriteLine(GetWeatherDisplay(27)); // output: Perfect!
As the preceding example shows, the syntax for the conditional operator is as follows:
condition ? consequent : alternative
The condition expression must evaluate to true or false . If condition evaluates to true , the consequent expression is evaluated, and its result becomes the result of the operation. If condition evaluates to false , the alternative expression is evaluated, and its result becomes the result of the operation. Only consequent or alternative is evaluated.
Beginning with C# 9.0, conditional expressions are target-typed. That is, if a target type of a conditional expression is known, the types of consequent and alternative must be implicitly convertible to the target type, as the following example shows:
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 >;
If a target type of a conditional expression is unknown (for example, when you use the var keyword) or the type of consequent and alternative must be the same or there must be an implicit conversion from one type to the other:
var rand = new Random(); var condition = rand.NextDouble() > 0.5; var x = condition ? 12 : (int?)null;
The conditional operator is right-associative, that is, an expression of the form
You can use the following mnemonic device to remember how the conditional operator is evaluated:
is this condition true ? yes : no
Conditional ref expression
A reference variable can be assigned conditionally with a conditional ref expression. You can also use a conditional ref expression as a reference return value or as a ref method argument.
The syntax for a conditional ref expression is as follows:
condition ? ref consequent : ref alternative
Like the original conditional operator, a conditional ref expression evaluates only one of the two expressions: either consequent or alternative .
In a conditional ref expression, the type of consequent and alternative must be the same. Conditional ref expressions aren't target-typed.
The following example demonstrates the usage of a conditional ref expression:
var smallArray = new int[] < 1, 2, 3, 4, 5 >; var largeArray = new int[] < 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
Conditional operator and an if statement
Use of the conditional operator instead of an if statement might result in more concise code in cases when you need conditionally to compute a value. The following example demonstrates two ways to classify an integer as negative or nonnegative:
int input = new Random().Next(-5, 5); string classify; if (input >= 0) < classify = "nonnegative"; >else < classify = "negative"; >classify = (input >= 0) ? "nonnegative" : "negative";
Operator overloadability
A user-defined type can't overload the conditional operator.
C# language specification
For more information, see the Conditional operator section of the C# language specification.
Specifications for newer features are: