JavaRush /Курси /C# SELF /Класичний оператор switch

Класичний оператор switch

C# SELF
Рівень 10 , Лекція 3
Відкрита

1. Вступ

Уявіть, що ви — бариста популярної кавʼярні. До вас підходить відвідувач і називає один із пʼяти улюблених напоїв. Ви не вдаєтеся до філософії, а швидко дивитеся в меню й реагуєте: «Капучино? Звісно! Ось ваше капучино!». Якби ви кожну позицію перевіряли окремими if, ваш код нагадував би купу чашок після обіднього напливу — громіздко й не дуже зручно.

Оператор switch дозволяє елегантно перевіряти значення змінної та виконувати різні дії залежно від результату. Працює він лише з певними типами даних (про них — трохи нижче), але для більшості користувацьких меню, простих команд чи розпізнавання статусів це — ідеальний інструмент.

2. Синтаксис класичного switch у C#

Ось базова схема роботи:


switch (Vyrazhennya) {
    case Znachennya1:
        // дії
        break;
    case Znachennya2:
        // дії
        break;
    ...
    default:
        // дії за замовчуванням
        break;
}
Класичний синтаксис switch у C#

Приклад 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 усередині? — Крок за кроком

  1. Спочатку обчислюється вираз у дужках після switch (у нашому прикладі — змінна choice).
  2. Програма порівнює його з кожним указаним значенням (case) по черзі.
  3. Якщо значення збіглося — виконуються інструкції цього блоку. Далі зустрічається break, і програма виходить із блоку switch.
  4. Якщо не збіглося ні з жодним 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/масив.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ