Оператор switch в C#

В этой статье вы познакомитесь с оператором switch и научитесь им пользоваться. 

Оператор switch в C# используется для замены конструкции  if...else. Главное его преимущество по сравнению с if...else — чистота и удобочитаемость.

Синтаксис

switch (переменная/выражение)
{
  case value1:
      // Этот блок кода выполняется, если выражение (или переменная) = value1
      break;
  case value2:
      // Этот блок кода выполняется, если выражение (или переменная) = value2
      break;
  ... ... ... 
  ... ... ... 
  default:
      // Этот блок кода выполняется, если выражение (или переменная) не равно ни одному value
}

Оператор switch принимает выражение или переменную и сравнивает его значение со значением каждого case (value1, value2, …). Когда оператор switch находит идентичное значение, выполняется блок кода внутри соответствующего case. 

Если ни одно значение case не соответствует выражению, выполняется блок кода внутри оператора default. Оператор default в конце switch аналогичен блоку else в конструкции if-else. 

Когда оператор switch находит подходящее значение, он также выполняет все нижестоящие блоки case. Это важный нюанс.

Чтобы этого избежать, нужно использовать оператор break в конце каждого блока case. Оператор break завершает выполнение оператора switch, что предотвращает выполнение несоответствующих case.

Пример 1. Используем оператор switch

using System;
 
namespace Conditional
{
    class SwitchCase
    {
        public static void Main(string[] args)
        {
            char ch;
            Console.WriteLine("Введите букву");
            ch = Convert.ToChar(Console.ReadLine());
            switch(Char.ToLower(ch))
            {
                case 'а':
                    Console.WriteLine("Гласная");
                    break;
                case 'у':
                    Console.WriteLine("Гласная");
                    break;
                case 'о':
                    Console.WriteLine("Гласная");
                    break;
                case 'ы':
                    Console.WriteLine("Гласная");
                    break;
                case 'и':
                    Console.WriteLine("Гласная");
                    break;
                case 'э':
                    Console.WriteLine("Гласная");
                    break;
                case 'я':
                    Console.WriteLine("Гласная");
                    break;
                case 'ю':
                    Console.WriteLine("Гласная");
                    break;
                case 'е':
                    Console.WriteLine("Гласная");
                    break;
                case 'ё':
                    Console.WriteLine("Гласная");
                    break;
                default:
                    Console.WriteLine("Согласная");
                    break;
            }
        }
    }
}

Вывод:

Введите букву
х
Согласная

В этом примере пользователь вводит букву алфавита. Буква, если она заглавная, конвертируется в прописную с помощью метода ToLower().

После этого оператор switch проверяет букву, которую ввел пользователь, на соответствие а, у, о, ы, и, э, я, ю, ё или е.

Если введенная буква соответствует какому-либо case, программа выводит сообщние «Гласная». Если нет — управление переходит к оператору default, и тогда программа печатает сообщение «Согласная»

Блоки кода всех case с гласными буквами одинаковые, так что мы можем их объединить.

Пример 2. Используем оператор switch с сгруппированными case

using System;
 
namespace Conditional
{
    class SwitchCase
    {
        public static void Main(string[] args)
        {
            char ch;
            Console.WriteLine("Введите букву");
            ch = Convert.ToChar(Console.ReadLine());
 
            switch(Char.ToLower(ch))
            {
                case 'а':                      
                case 'у':                      
                case 'о':                      
                case 'ы':                      
                case 'и':
                case 'э':                                            
                case 'я':                                            
                case 'ю':                      
                case 'е':                                           
                case 'ё':
                    Console.WriteLine("Гласная");
                    break;
                default:
                    Console.WriteLine("Согласная");
                    break;
            }
        }
    }
}

Вывод будет таким же, как и у программы выше. В программе выше все case с гласными буквами печатали «Гласная» и завершали выполнение оператора switch.

Хоть оператор switch и делает код более читаемым, но у него есть ограничения. Он работает только со следующими типами данных: 

  • примитивные типы данных: bool, char, целые числа;
  • перечисляемые типы данных (Enum);
  • строки;
  • nullable-типы.

Пример 3. Пишем простейший калькулятор, основанный на switch

using System;
 
namespace Conditional
{
    class SwitchCase
    {
        public static void Main(string[] args)
        {
            char op;
            double first, second, result;
             
            Console.Write("Введите первое число: ");
            first = Convert.ToDouble(Console.ReadLine());
            Console.Write("Введите второе число: ");
            second = Convert.ToDouble(Console.ReadLine());
            Console.Write("Введите оператор (+, -, *, /): ");
            op = (char)Console.Read();
 
            switch(op)
            {
                case '+':
                    result = first + second;
                    Console.WriteLine("{0} + {1} = {2}", first, second, result);
                    break;
                 
                case '-':
                    result = first - second;
                    Console.WriteLine("{0} - {1} = {2}", first, second, result);
                    break;
                 
                case '*':
                    result = first * second;
                    Console.WriteLine("{0} * {1} = {2}", first, second, result);
                    break;
                 
                case '/':
                    result = first / second;
                    Console.WriteLine("{0} / {1} = {2}", first, second, result);
                    break;
 
                default:
                    Console.WriteLine("Недопустимый оператор");
                    break;
                     
            }
        }
    }
}

Вывод:

Введите первое число: -13.11
Введите второе число: 2.41
Введите оператор (+, -, *, /): *
-13.11 * 2.41 = -31.5951

Эта программа принимает два операнда и оператор, которые вводит пользователь. Затем она производит операцию, которая зависит от введенного оператора.

Ввод данных осуществляется с помощью методов ReadLine() и Read()

Для выбора нужного оператора программа использует оператор switch. То же самое можно реализовать и с помощью оператора if-else.

Проверьте себя
1. Что выведет код, если пользователь не ввёл ни одно из перечисленных значений? switch(op) { case '+': ...; break; case '-': ...; break; default: Console.WriteLine("Ошибка"); break; }
AНичего
BОшибка
CПрограмма упадёт с исключением
DВыполнятся все case подряд
2. Зачем нужен оператор `break` в каждом блоке `case`?
AЧтобы выйти из программы
BЧтобы предотвратить выполнение следующих блоков case после совпадения
CЧтобы перейти к следующему case
Dbreak необязателен — он лишь улучшает читаемость
3. Какой из перечисленных типов данных НЕ поддерживается оператором `switch`?
Astring
Bint
Cchar
Ddouble
4. Что произойдёт, если в switch несколько case написать подряд без break между ними?
AВсе они будут ссылаться на один блок кода
BОшибка компиляции
CВыполнится только первый из них
DВыполнятся все блоки по очереди

Закрепите практикой

Задачи с автоматической проверкой — решайте прямо здесь, не уходя из учебника.