Защо ни трябват условия
До сега програмите ни вървяха „по права линия" — ред след ред. Но истинските задачи изискват избор: ако ученикът има 6, извеждаме „отличен"; ако е по-малък от 18, не може да гласува; ако паролата е грешна, не пускаме потребителя.
За това служат условните конструкции. Те питат за нещо (булев израз, който е true или false) и избират кой блок код да изпълнят.
Просто if
if (условие)
{
// изпълнява се САМО ако условието е true
}Пример:
int grade = 6;
if (grade == 6)
{
Console.WriteLine("Отличен!");
}Едноредови блокове
Ако в блока има само един ред, може да изпуснеш скобите. Но за начало винаги ги слагай — кодът става по-четим и по-безопасен при промени.
if … else
Когато искаш да се изпълни едното или другото:
int age = 17;
if (age >= 18)
{
Console.WriteLine("Пълнолетен");
}
else
{
Console.WriteLine("Непълнолетен");
}Верижно if … else if … else
За повече от два варианта подреждаме няколко условия. Изпълнява се първото, което е истина — останалите се пропускат.
int grade = 5;
if (grade == 6)
{
Console.WriteLine("Отличен");
}
else if (grade == 5)
{
Console.WriteLine("Много добър");
}
else if (grade == 4)
{
Console.WriteLine("Добър");
}
else if (grade == 3)
{
Console.WriteLine("Среден");
}
else
{
Console.WriteLine("Слаб");
}Внимавай за реда
Ако имаш условия като grade > 3 и grade > 4 — сложи първо > 5, после > 4, после > 3. Иначе всеки 5 ще хване > 3 и никога няма да стигнеш до по-точните проверки.
Вложени if (if в if)
Понякога вътре в един блок имаш нужда от ново условие:
int age = 16;
bool hasLicense = true;
if (age >= 16)
{
if (hasLicense)
{
Console.WriteLine("Може да кара мотопед");
}
else
{
Console.WriteLine("Първо вземи книжка");
}
}
else
{
Console.WriteLine("Твърде малък си");
}Често има по-чист начин
Същото може да се напише с &&:
if (age >= 16 && hasLicense)
{
Console.WriteLine("Може да кара мотопед");
}Но обединяването е добре, когато всички клонове правят сходни неща. Ако „else"-те се различават драстично, остави вложените if.
Тернарен оператор ?:
Кратка форма за избор на стойност (не за изпълнение на блок):
условие ? стойност-ако-true : стойност-ако-falseint age = 17;
string status = age >= 18 ? "пълнолетен" : "непълнолетен";
int a = 5, b = 7;
int max = a > b ? a : b; // 7Бележка
Не злоупотребявай — за сложна логика обикновеният if е по-четим. Тернарният е добър за кратки присвоявания.
switch — много варианти
Когато сравняваш една стойност с много възможни варианти, switch е по-чист от верижно if:
int day = 3;
switch (day)
{
case 1:
Console.WriteLine("Понеделник");
break;
case 2:
Console.WriteLine("Вторник");
break;
case 3:
Console.WriteLine("Сряда");
break;
case 4:
case 5:
Console.WriteLine("Четвъртък или петък");
break;
default:
Console.WriteLine("Уикенд или невалидно");
break;
}case— стойност за сравнение.break— край на този клон (задължителен в C#).default— изпълнява се, ако никой case не съвпадне.- Няколко
caseподред означават „едното ИЛИ другото".
switch израз (C# 8+)
По-нова, по-къса форма за избор на стойност:
int day = 3;
string name = day switch
{
1 => "Понеделник",
2 => "Вторник",
3 => "Сряда",
4 or 5 => "Четвъртък или петък",
_ => "Уикенд или невалидно"
};
Console.WriteLine(name);_ е „всичко останало" (като default).
Кога кое да ползваш
- if / else — за всичко, особено когато условията са сложни или различни (не една и съща променлива).
- if / else if / else — много варианти на сложно условие.
- switch — сравняваш една и съща стойност с много константи.
- ?: — само за кратко присвояване на стойност.
Какво трябва да запомниш
ifизпълнява блок само когато условието еtrue.- При
else ifсе изпълнява първото съвпадащо условие — затова редът има значение. - За множествен избор по една стойност използвай
switch; не забравяйbreak. - За кратко присвояване — тернарен
x ? a : b. - Винаги ползвай скоби
{ }около блоковете — кодът става по-сигурен.