1. Вступ
Уявіть, що ви — бариста популярної кавʼярні. До вас підходить відвідувач і називає один із пʼяти улюблених напоїв. Ви не вдаєтеся до філософії, а швидко дивитеся в меню й реагуєте: «Капучино? Звісно! Ось ваше капучино!». Якби ви кожну позицію перевіряли окремими if, ваш код нагадував би купу чашок після обіднього напливу — громіздко й не дуже зручно.
Оператор switch дозволяє елегантно перевіряти значення змінної та виконувати різні дії залежно від результату. Працює він лише з певними типами даних (про них — трохи нижче), але для більшості користувацьких меню, простих команд чи розпізнавання статусів це — ідеальний інструмент.
2. Синтаксис класичного switch у C#
Ось базова схема роботи:
switch (Vyrazhennya) {
case Znachennya1:
// дії
break;
case Znachennya2:
// дії
break;
...
default:
// дії за замовчуванням
break;
}
Приклад 1: класичне меню
Console.WriteLine("Оберіть напій: 1 - Кава, 2 - Чай, 3 - Какао");
string input = Console.ReadLine();
int choice = int.Parse(input);
switch (choice)
{
case 1:
Console.WriteLine("Ви обрали каву. Чудовий вибір!");
break;
case 2:
Console.WriteLine("Чай — теж добре.");
break;
case 3:
Console.WriteLine("Какао — для цінителів затишку!");
break;
default:
Console.WriteLine("Такого напою немає в меню.");
break;
}
- Блок switch порівнює choice зі значеннями після case.
- Після кожного варіанту обовʼязково має бути break; інакше виконання перейде до наступного case (про це нижче).
- Блок default — це як else: він спрацює, якщо не збігнеться жоден case.
Як працює switch усередині? — Крок за кроком
- Спочатку обчислюється вираз у дужках після switch (у нашому прикладі — змінна choice).
- Програма порівнює його з кожним указаним значенням (case) по черзі.
- Якщо значення збіглося — виконуються інструкції цього блоку. Далі зустрічається break, і програма виходить із блоку switch.
- Якщо не збіглося ні з жодним case, виконується блок default (якщо він є).
Візуальна схема
| Значення змінної | case 1 | case 2 | case 3 | default |
|---|---|---|---|---|
| 1 | + | |||
| 2 | + | |||
| 3 | + | |||
| інше | + |
«+» — цей блок виконується
3. Які типи підтримує класичний switch?
У класичному синтаксисі (тобто без «Pattern Matching» та нових можливостей, про які поговоримо пізніше) switch підтримує:
- Прості цілочисельні типи (int, byte, char, long, short, sbyte, ushort, uint, ulong)
- Рядки (string)
- Перерахування (enum)
- Символи (char)
Приклад 2: перемикання за рядками
Console.WriteLine("Оберіть команду: start, stop, pause");
string command = Console.ReadLine();
switch (command)
{
case "start":
Console.WriteLine("Програма запущена!");
break;
case "stop":
Console.WriteLine("Програма зупинена.");
break;
case "pause":
Console.WriteLine("Програма на паузі.");
break;
default:
Console.WriteLine("Невідома команда.");
break;
}
4. Навіщо потрібен break і що буде, якщо його забути?
Найпоширеніша помилка серед новачків — забути break; усередині case. Давайте розберемося, що станеться, якщо його пропустити.
Приклад 3: падіння в наступний блок (fall-through)
int day = 2;
switch (day)
{
case 1:
Console.WriteLine("Понеділок");
break;
case 2:
Console.WriteLine("Вівторок");
case 3:
Console.WriteLine("Середа");
break;
default:
Console.WriteLine("Невідомий день");
break;
}
Що відбудеться?
- Вхідне значення: day = 2.
- Спочатку виведеться рядок: "Вівторок"
- Оскільки немає break, виконання одразу перейде до case 3 і виведе: "Середа"
- Далі — break; і вихід.
На екрані побачимо:
Вівторок
Середа
Це типова помилка!
- Якщо вам потрібно виконати лише одну дію, ставте break; у кожному case.
- Якщо (рідко) вам потрібно, щоб кілька варіантів виконували ту саму логіку, їх можна «склеїти» (див. нижче).
5. Групування значень case
Іноді кілька значень мають поводитися однаково. Навіщо копіювати один і той самий код?
Приклад 4: однакова реакція на кілька case
char grade = 'B';
switch (grade)
{
case 'A':
case 'B':
case 'C':
Console.WriteLine("Залік!");
break;
case 'D':
case 'E':
Console.WriteLine("Є куди рости.");
break;
default:
Console.WriteLine("Невірна оцінка.");
break;
}
Що відбувається?
- Якщо grade — це 'A', 'B' або 'C', спрацює перший блок: "Залік!".
- Якщо 'D' або 'E' — спрацює другий блок.
- Якщо інше — default.
6. Що можна, а що не можна у класичному switch
Можна:
- Використовувати літерали (константи) в case, наприклад: case 1:, case 'A':, case "stop":.
- Порівнювати enum (перерахування).
- Пропускати default, хоча зазвичай він корисний.
Не можна:
- Використовувати змінні в case (тільки константи).
- Задавати діапазони порівняння (case >= 5:, case x > 10: — так не можна!).
- Використовувати double, float та інші дійсні типи — дозволені лише цілі типи, string, char, enum.
- Писати кілька значень через кому в одному case (case 1, 2: — так не можна; пишіть кілька case підряд).
7. Особливості та типові помилки
У реальних проєктах switch часто використовують для меню, обробки статусів, команд, кодів помилок — і ще для тисячі різних завдань. Але, як і в будь-якого інструмента, є нюанси.
Типові помилки:
- Пропущений break (про що вже говорили).
- Неправильний тип switch-виразу (наприклад, спроба використати double).
- Невідповідність регістру рядків (case "Start": не збігнеться зі "start") — рядки порівнюються з урахуванням регістру!
- Необроблене значення (пропущено default, користувач увів щось інше).
Пастка з вкладеними switch-ами
Хоча такий код інколи трапляється, найчастіше його важко читати. Якщо ловите себе на тому, що вкладаєте switch у switch, можливо, час винести частину логіки в окремий метод або навіть застосувати ООП/enum/масив.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ