Условные выражения и ветвления
Условные выражения и ветвления
Условные операции
Программы редко выполняются линейно. Чаще всего они должны принимать решения на основе данных. Для этого в 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.