Оператор выбора switch
позволяет выполнять какие-либо операторы на выбор из нескольких вариантов в зависимости от условия. В этом отличие оператора switch
от условного оператора if – что он позволяет сделать выбор из нескольких вариантов.
В общем виде структура конструкции switch
может быть представлена следующим образом:
switсh ( выражение ) { case метка1 : операторы; break; case метка2 : операторы; break; // здесь могут быть еще какие-либо варианты // блок default выполняется если ни один из вариантов не совпал с условием default : операторы; break; }
В этом коде выражение
– любое выражение, кроме NULL
. Важно помнить, что до C# 7.0 выражение
могло принимать только целочисленные значения ( int
, long
), логические ( bool
), символьные ( char
, string
), а также значения перечислений ( enum
).
Метки case
могут содержать константные значения, для проверки выражения
. C# 6.0 не допускает повторяющихся константных значений в метках. Следующий код, например, генерирует ошибку:
// Ошибка CS0152 Предложение Switch содержит несколько случаев со значением метки "0". Random random = new Random(); int i = random.Next(0,10); switch(i) { case 0: case 1: case 2: Console.WriteLine(i); break; case 0: break; }
В блоке switch
допускается использование одной метки по умолчанию – default
, операторы которой выполняются в том случае, если другие константные выражения не совпали с условием.
Не допускается сквозное выполнение операторов в пределах нескольких меток. Не пустые метки должны заканчиваться оператором break
, goto
, return
. Следующий код генерирует исключение:
// Ошибка CS0163 Управление не может передаваться вниз от одной метки case ("case 1:") к другой. Random random = new Random(); int i = random.Next(0,10); switch(i) { case 0: case 1: // метка без break Console.WriteLine(i); case 2: Console.WriteLine(i); break; case 0: break; }
Однако допускается последовательное использование нескольких пустых меток:
Random random = new Random(); int i = random.Next(0,10); switch(i) { default: break; case 0: case 1: case 2: case 3: case 4: case 5: Console.WriteLine(i); break; }
В этом примере на консоль будет выведено число только если оно меньше или равно 5.
При помощи оператора goto
допускается переход от одной метки к другой, как показано в следующем примере:
switch(DateTime.Now.DayOfWeek) { case DayOfWeek.Saturday: Console.WriteLine("Выходной"); break; case DayOfWeek.Sunday: goto case DayOfWeek.Saturday; default: Console.WriteLine("Рабочий день"); break; }