Перейти к основному содержимому

Условные выражения и ветвления

Разработчику Архитектору

Условные выражения и ветвления

Условные операции

Программы редко выполняются линейно. Чаще всего они должны принимать решения на основе данных. Для этого в C# используются условные операции — конструкции, которые позволяют выполнять разные блоки кода в зависимости от условия.


if, else, else if

Самый базовый способ ветвления — оператор if. Он проверяет условие и, если оно истинно (true), выполняет блок кода.

Синтаксис:

if (условие)
{
// код, если условие истинно
}
else if (другое_условие)
{
// код, если первое ложно, а второе — истинно
}
else
{
// код, если все условия ложны
}

Разбор:

  • if запускает блок только при истинном условии.
  • else if проверяет дополнительные варианты, если предыдущие условия не сработали.
  • else служит запасной веткой, когда все проверки ложны.
  • Выполняется только первая подходящая ветка сверху вниз.

Пример:

Код ITЗагрузка примера кода…

Разбор:

  • Переменная age задаёт входные данные для ветвления.
  • age < 13 отсекает детский возраст.
  • age < 18 сработает только если первая проверка ложна.
  • Для значения 20 программа попадёт в else и выведет "Взрослый".

else if может быть сколько угодно.

else — необязательный, но должен быть последним.

Если блок состоит из одной строки, фигурные скобки можно опустить (но не рекомендуется):

if (age > 18)
Console.WriteLine("Совершеннолетний");

Разбор:

  • Это однострочная форма if без фигурных скобок.
  • Под условием находится только одна команда — вывод в консоль.
  • При добавлении ещё одной строки без скобок она уже не будет зависеть от условия.
  • Поэтому в командной разработке обычно оставляют скобки даже для одного выражения.

switch, case

switch используется, когда нужно выбрать один из нескольких вариантов на основе значения переменной.

Синтаксис:

switch (выражение)
{
case значение1:
// код
break;
case значение2:
// код
break;
default:
// код по умолчанию
break;
}

Разбор:

  • switch сравнивает одно выражение с несколькими вариантами case.
  • break завершает текущую ветку и предотвращает неявный переход ниже.
  • default обрабатывает все значения, которые не подошли ни под один case.
  • Такая форма удобна, когда веток много и они зависят от одного параметра.

Пример:

Код ITЗагрузка примера кода…

Разбор:

  • Значение переменной day сравнивается с вариантами дней недели.
  • Для "понедельник" выполнится первая ветка и выведет "Начало недели".
  • case "суббота" и case "воскресенье" объединены в общий блок.
  • default сработает для любого неучтённого дня.

case должен завершаться break, return, throw или goto (иначе ошибка компиляции — "fall-through" запрещён).

Можно группировать case (как в субботу/воскресенье).

default — необязательный, но рекомендуется.


switch expression

Начиная с C# 8, появилось выражение switch (switch expression) — более лаконичный и функциональный способ записи switch. Он возвращает значение, как тернарный оператор, и использует стрелку =>.

Это очень симпатичный способ заменить большое количество if/else:

var result = выражение switch
{
значение1 => результат1,
значение2 => результат2,
_ => значение_по_умолчанию
};

Разбор:

  • Это switch expression — выражение, которое сразу возвращает значение.
  • Каждая строка шаблон => результат задаёт правило сопоставления.
  • Символ _ — универсальный шаблон, аналог default.
  • Результат удобно напрямую присваивать переменной.

Здесь "_" — это discard, аналог default.

Пример:

string day = "пятница";

string mood = day switch
{
"понедельник" => "Устал...",
"пятница" => "Йеее, выходные!",
"суббота" => "Отдыхаю",
"воскресенье" => "Грущу перед понедельником",
_ => "Нормально"
};

Console.WriteLine(mood); // "Йеее, выходные!"

Разбор:

  • day switch { ... } вычисляет итоговую строку mood по значению day.
  • Для "пятница" срабатывает соответствующая ветка "Йеее, выходные!".
  • Каждая ветка возвращает строку, а _ ловит все остальные случаи.
  • Console.WriteLine(mood) выводит итог вычисления.

switch и switch expression поддерживают pattern matching — проверку типа, значения и структуры.

object value = "Hello";

string type = value switch
{
null => "Пусто",
int => "Целое число",
string s when s.Length > 5 => "Длинная строка",
string => "Короткая строка",
_ => "Неизвестный тип"
};

Разбор:

  • Здесь switch сопоставляет объект не только по значению, но и по типу.
  • string s when s.Length > 5 объединяет проверку типа и дополнительное условие (when).
  • Ветка string ниже перехватывает остальные строки, не подошедшие под длину.
  • Для "Hello" (длина 5) результатом будет "Короткая строка".

Здесь:

  • string s when s.Length > 5 — проверка типа и условия;
  • string — просто проверка типа;
  • int — тоже проверка типа.

Тернарный оператор

Тернарный оператор (? : ) – сокращённая форма условия if-else. Это самая короткая форма ветвления. Используется, когда нужно выбрать одно из двух значений.

string result = (score >= 50) ? "Прошёл" : "Не прошёл";

Разбор:

  • Тернарный оператор выбирает одно из двух значений на основе булева условия.
  • score >= 50 определяет успешность прохождения.
  • При true будет "Прошёл", при false"Не прошёл".
  • Такой формат подходит для коротких, одношаговых решений.

Синтаксис стандартный:

условие ? значение_если_истина : значение_если_ложь

Разбор:

  • Общая форма тернарного оператора ?:.
  • Сначала вычисляется условие.
  • Затем возвращается либо "истинная", либо "ложная" ветка.
  • Это выражение, поэтому его можно использовать прямо в присваивании и аргументах методов.

Можно вкладывать! Но не злоупотребляйте, а то будет нечитаемо:

string category = age < 13 ? "Ребёнок" :
age < 18 ? "Подросток" : "Взрослый";

Разбор:

  • Здесь вложенный тернарный оператор реализует три категории возраста.
  • Логика эквивалентна if / else if / else.
  • Код работает, но читается сложнее из-за вложенности.
  • Для расширяемых правил обычно лучше switch expression или обычный if.

Такой код читается плохо. Лучше использовать if или switch expression.