1. Базовый синтаксис вложенного if
В реальной жизни редко встретишь ситуацию, когда решение принимается только по одному критерию. Обычно приходится проверять сразу несколько условий, и они часто зависят друг от друга. Например, чтобы попасть на концерт, недостаточно быть просто взрослым — иногда нужно быть еще и в списке приглашённых. Вот тут на сцену выходит так называемая многоуровневая логика, и помогают нам в этом вложенные операторы if.
Вложенные условия — это когда один if живет внутри другого. Представьте себе коробку в коробке: если первая коробка открылась (условие выполнилось), тогда смотрим, что внутри и, возможно, открываем вторую. С точки зрения кода и логики это очень мощный инструмент.
Начнём с простого:
if (условиеА)
{
// действия, если условиеА — true (истина)
if (условиеБ)
{
// действия, если оба условия истинны
}
}
Если вам это напоминает матрёшку — вы всё понимаете правильно! Вложенный if внутри внешнего будет выполняться только если внешний сработал.
Пример: проход в клуб
Давайте разовьем наше учебное приложение, где пользователь ранее вводил имя и возраст. Теперь добавим второй уровень проверки: допустим, чтобы попасть в закрытый клуб, нужно быть старше 21 года и иметь пригласительный код.
Console.Write("Введите ваше имя: ");
string name = Console.ReadLine();
Console.Write("Введите ваш возраст: ");
int age = int.Parse(Console.ReadLine());
if (age >= 21)
{
Console.Write("Введите пригласительный код: ");
string code = Console.ReadLine();
if (code == "VIP2024")
{
Console.WriteLine("Добро пожаловать, " + name + ", в VIP-клуб!");
}
else
{
Console.WriteLine("Извините, неверный код. Доступ запрещён.");
}
}
else
{
Console.WriteLine("Извините, вход только с 21 года!");
}
Обратите внимание: внутренний if проверяет код только если возраст уже прошёл проверку. Это экономит ресурсы (и не нервирует охранника).
2. Сколько уровней вложенности допустимо?
Технически, сколько угодно. Но по факту — чем больше вложенных уровней, тем сложнее читать и поддерживать такой код. На практике редко используют вложенность больше 2-3 уровней. Если возникают ситуации с «лесенками» из 4 и более вложенных if, стоит задуматься: возможно, есть способ упростить логику или вынести часть проверки в отдельные функции (а это тема отдельной лекции!).
3. Вложенные if и else: ловушки и нюансы
Ошибка новичков: небрежное оформление фигурных скобок.
Когда вы пишете вложенные условия, особенно при использовании else, C# строго следует правилам синтаксиса. Если не добавить фигурные скобки {}, то к if или else относится только первая строка после них. Это частый источник досадных багов.
Пример с потенциальной ошибкой:
if (age >= 21)
if (code == "VIP2024")
Console.WriteLine("Добро пожаловать!");
else
Console.WriteLine("Неверный код.");
Многие ожидают, что else относится к проверке возраста, но на самом деле оно относится к ближайшему перед ним if (проверке кода приглашения). Из-за этого сообщения могут показываться не так, как ожидалось. Лучше всегда использовать скобки — даже если внутри только одна строка!
Чтобы не было недопонимания, покажу еще раз. Компилятор воспринимает код выше вот так:
if (age >= 21)
{
if (code == "VIP2024")
Console.WriteLine("Добро пожаловать!");
else
Console.WriteLine("Неверный код.");
}
Важно! Еще раз:
Если в конструкции if-else не расставлены фигурные скобки, else относится к предыдущему (ближайшему к нему) if-у.
4. Альтернативы: else if во вложенных условиях
Иногда внутри внешнего if хочется не только проверить одно дополнительное условие, но и предусмотреть альтернативу. Например, если пригласительный код не подошёл, можно предложить купить билет. Это делается вложенной конструкцией else if/else:
if (age >= 21)
{
Console.Write("Введите пригласительный код: ");
string code = Console.ReadLine();
if (code == "VIP2024")
{
Console.WriteLine("Добро пожаловать в клуб!");
}
else if (code == "GUEST")
{
Console.WriteLine("Гостевой режим: доступ только до 23:00.");
}
else
{
Console.WriteLine("Увы, доступ невозможен.");
}
}
else
{
Console.WriteLine("Вход только с 21 года.");
}
В этом примере мы сделали вложенный выбор между тремя сценариями: VIP-код, гостевой код и отказ.
5. Практика: калькулятор скидки с многоуровневой логикой
Давайте напишем такое приложение: пользователю начисляется скидка в магазине на основе возраста и наличия клубной карты.
- Если возраст пользователя больше или равен 60 — скидка 15%.
- Если возраст меньше, но у пользователя есть клубная карта — скидка 7%.
- В остальных случаях скидки нет.
Как это оформить?
Console.Write("Введите ваш возраст: ");
int age = int.Parse(Console.ReadLine());
double discount = 0.0;
if (age >= 60)
{
discount = 0.15;
}
else
{
Console.Write("Есть ли у вас клубная карта (да/нет)? ");
string hasCard = Console.ReadLine();
if (hasCard == "да")
{
discount = 0.07;
}
}
Console.WriteLine("Ваша скидка: " + (discount * 100) + "%");
Здесь мы использовали вложенный if внутри ветки else. Если возраст не подошёл, только тогда спрашиваем про карту.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ