Урок № 10. Оператор выбора switch…case


Switch-case

Доброго времени суток! Пришло время поговорить еще об одном полезном операторе, операторе выбора switch..case. Сразу скажу, что на практике, оператор выбора switch..case можно заменить несколькими операторами if..else, но такой код, как минимум труднее читать и сопровождать, так что, не пренебрегайте  оператором  switch..case.

И так, для чего же нужен этот самый оператор? Да всё просто, давайте вспомним как работает оператор выбора if..else. А работает он по схеме: проверка условия, если оно выполнилось — делаем одно дело, не выполнилось — другое! Это хорошо подходит для случаев, когда ставится «вопрос ребром», т.е. условием является сравнение «больше/меньше», или «равно/не равно», но бывают такие случаи, когда нужно значение одной переменной сравнить с несколькими стандартными (заранее заданными) значениями, и при совпадении с одним из них, выполнить один блок операторов, в случае при совпадении с другим — другой блок, с третьим — третий блок.

Вот как это выглядит на практике:

//Предположим, что переменная код получила значение 2
int code = 2;

//В зависимости от значения переменной code
switch (code)
{
    //Первая секция ------------------------------

    //Если значение переменной равно 1
    case 1:
    {
        Console.WriteLine("Блок 1");
    }
    break;
    //Конец первой секции ------------------------

 
    //Вторая секция ------------------------------

    //Если значение переменной равно 2
    case 2:
    {
        Console.WriteLine("Блок 2");
    }
    break;
    //Конец второй секции ------------------------

 
    //Третья секция ------------------------------

    //Если значение переменной равно 3
    case 3:
    {
        Console.WriteLine("Блок 3");
    }
    break;
    //Конец третьей секции ------------------------
}

В этом примере, оператор выбора анализирует значение переменной «code» (переменная, которая подвергается анализу, указывается в круглых скобках после ключевого слова switch), т.е. сравнивает со значениями, указанными в каждой секции, после ключевого слова case. Если значение переменной «code» совпадает со значением какой-то секции, то выполняется именно эта секция (в нашем случае это вторая секция). А  каждая секция в операторе switch..case ограничена ключевым словом case в начале и ключевым словом break (с точкой с запятой) в конце. После ключевого слова case, через пробел, указывается значение, с которым сравнивается анализируемая переменная, после этого значения ставится двоеточие. Между ключевыми словами case и break может находится как один оператор, так и блок операторов (и фигурные скобки тут необязательны, но желательны).

Но выше была представлена упрощенная версия оператора выбора switch..case. А теперь рассмотрим такой случай, когда значение анализируемой переменной может не совпасть не с одним из предложенных вариантов… Такую ситуацию, можно обработать (правда это не всегда нужно, но знать не будет лишним):

//Предположим, что переменная код получила значение 10
int code = 10;

//В зависимости от значения переменной code
switch (code)
{
    //Первая секция ------------------------------

    //Если значение переменной равно 1
    case 1:
    {
        Console.WriteLine("Блок 1");
    }
    break;
 
    //Конец первой секции ------------------------

 
    //Вторая секция ------------------------------

    //Если значение переменной равно 2
    case 2:
    {
        Console.WriteLine("Блок 2");
    }
    break;
    //Конец второй секции ------------------------

 
    //Третья секция ------------------------------

    //Если значение переменной равно 3
    case 3:
    {
        Console.WriteLine("Блок 3");
    }
    break;
    //Конец третьей секции ------------------------

    //Секция, по умолчанию ------------------------
    default:
    {
        Console.WriteLine("Блок по умолчанию");
    }
    break;
    //Конец секции --------------------------------
}

Вот в приведенном примере и выполнится секция по умолчанию, начинается она со слова default а заканчивается тоже словом break с точной с запятой. Почему в этом примере выполнится секция default? Да потому, что значение анализируемой переменной (в данном случае 10) не совпадает со значениями, указанными в секциях case (так сказать, в кейсах).

Попробуйте вставить приведенные выше фрагменты кода в метод Main нового проекта, и сами наглядно убедитесь в что выполнятся именно те блоки кода, про которые я говорил. А потом, попробуйте поменять значение переменной «code» до оператора выбора switch..case, и посмотрите как будет вести себя программа.

Перейти к следующему уроку