Оператор ? :

Тернарный оператор ? : часто используется вместо цепочки операторов if-else, которая используется следующим образом

if(условие)
    var = выражение1;
else
    var = выражение2;

Вместо этой конструкции можно использовать оператор ? :. Оператор ? : называется тернарным, так как ему требуется три операнда. Синтаксис выглядит так:

Выражение1 ? Выражение2 : Выражение3

Выражение1 является булевым выражением, а элементы Выражение2 и Выражение3 - это выражения, типы которых должны быть одинаковыми. Вначале оценивается Выражение1. Если оно имеет значение true, то выполняется Выражение2, которое и становится результатом всего выражения. Если выражение Выражение1 имеет значение false, то выполняется выражение Выражение3, которое становится результатом всего выражения. Рассмотрим пример, в котором переменной absval присваивается абсолютное значение переменной val.

int absval, val;
val = 5;
absval = val < 0 ? -val : val;
            
Console.WriteLine(absval);

val = -5;
absval = val < 0 ? -val : val;

Console.WriteLine(absval);
Console.ReadLine();

Переменной absval будет присвоено значение переменной val, если значение больше или равно нулю (вторая часть выражения). Если значение переменной val отрицательное, то переменной absval присваивается значение переменной, взятое со знаком минус, в результате минус на минус даст плюс, то есть положительно значение. Перепишем код с использованием if-else

if(val < 0) absval = -val;
else absval = val;

В этом примере с помощью оператора ? запрещается деление на ноль.

int result;

for(int i = -5; i < 6; i++)
{
    <b>result = i != 0 ? 100 / i : 0;</b> // предотвращение деления на ноль
    if(i != 0)
        Console.WriteLine("100 / " + i + " = " + result);
}

Обратите внимание на выделенную строчку. Здесь переменной result присваивается результат деления числа 100 на значение переменной i. Однако это деление происходит в том случае, если значение переменной не равно 0. В противном случае деление не выполняется, а переменной result присваивается значение 0.

Но на самом деле нет необходимости присваивать значение, получающее в результате выполнения оператора ? какой-либо переменной. Это значение можно использовать в качестве аргумента при вызове метода. Либо, если все выражения имеют тип bool, оператор ? можно использовать в качестве условного выражение в цикле или операторе if. Перепишем предыдущий пример по новому.

for(int i = -5; i < 6; i++)
    if(i != 0 ? true : false)
        Console.WriteLine("100 / " + i + " = " + 100 / i);
Console.ReadLine();

Обратите внимание на использование оператора if. Если значение переменной i равно 0, то результатом оценки условного выражение оператора if будет значение false. Таким образом предотвращается деление на ноль и не выполняется метод WriteLine(). Во всех остальных случаях деление выполняется.

Пример для WinForm

Добавим на форму метку Label под именем lblGreeting. Предположим, мы хотим поздороваться с пользователем, в зависимости от времени суток. Сначала напишем громоздкий вариант, используя if-else:

if (DateTime.Now.Hour < 12)
    lblGreeting.Text = "Good morning"; // если до 12, то Доброе утро
else
    lblGreeting.Text = "Good afternoon"; // если после 12, то Добрый день

Вариант с тернарным оператором будет проще:

lblGreeting.Text = (DateTime.Now.Hour < 12) ? "Good morning" : "Good afternoon";
Реклама