Оператор выбора switch

Оператор выбора 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;
}
avatar
5000
  Подписаться  
Уведомление о