На этом шаге мы рассмотрим особенности использования этого переключателя.
Переключатель switch позволяет выполнить проверку значения некоторого выражения. В языке C# выражение, которое проверяется с помощью конструкции выбора switch, может возвращать значение целочисленного, символьного или текстового типа. Описывается переключатель следующим образом. Сначала указывается ключевое слово switch, после которого в круглых скобках следует проверяемое выражение. Тело переключателя заключается в фигурные скобки. Там описываются case-блоки. Каждый такой блок начинается с ключевого слова case. После него указывается контрольное значение (заканчивается двоеточием). Каждый case-блок содержит набор команд, заканчивающийся инструкцией break. Контрольные значения в case-блоках сравниваются со значением выражения в switch-инструкции. Если совпадение найдено, то выполняются команды в соответствующем case-блоке. На случай, если совпадения нет, в конструкции выбора switch может быть предусмотрен блок default. Общий шаблон описания переключателя switch с тремя case-блоками представлен ниже:
switch (выражение) { case значение_1: // Команды break; case значение_2: // Команды break; case значение_3: // Команды break; default: // Команды break; }
Блок default не является обязательным - его можно не указывать совсем. На рисунке 1 показана схема, иллюстрирующая способ выполнения переключателя switch.

Рис.1. Выполнение переключателя
Таким образом, при выполнении конструкции выбора сначала вычисляется значение выражения в switch-инструкции. Полученное значение последовательно сравнивается с контрольными значениями в case-блоках. При первом же совпадении выполняются команды в соответствующем case-блоке - вплоть до инструкции break. Если совпадение не найдено и в конструкции выбора есть default-блок, то выполняются команды в этом блоке. Если совпадение не найдено и default-блока в переключателе нет, то ничего не происходит.
И условная конструкция, и переключатель, и рассматриваемые далее циклические конструкции - все перечисленные управляющие инструкции есть не только в языке С#, но и, скажем, в языках C++ и Java.
Даже больше - там они практически такие же, как в языке С#. И в плане синтаксиса, и в плане принципов выполнения. Но вот конструкция выбора в C# немного отличается.
Во-первых, кроме целочисленных и символьных выражений здесь могут использоваться и текстовые выражения. Такого нет в языке C++ (там проверяемое выражение может быть целочисленным или символьным).
Во-вторых, в C# в конструкции выбора, если case-блок непустой, он должен заканчиваться break-инструкцией. В отличие от С#, в языках C++ и Java
case-блок может заканчиваться инструкцией break, но это не обязательно. Вообще, инструкция break используется для завершения работы операторов цикла или оператора выбора.
Само по себе завершение команд в case-блоке конструкции выбора ее работу не завершает. Другими словами, если в каком-то case-блоке команды выполнились, то это к автоматическому завершению
выполнения всего оператора выбора не приводит. Чтобы завершить конструкцию выбора, нужна инструкция break. Чисто гипотетически, если бы case-блок не заканчивался инструкцией break, то после
завершения выполнения команд в этом блоке должно было бы начаться выполнение команд в следующем case-блоке (даже если нет совпадения с контрольным значением в этом блоке).
В языках C++ и Java все так и происходит. Что касается языка С#, то здесь при проверке значения выражения и сравнении его с контрольными значениями case-блоки могут перебираться не в том порядке,
как они указаны в переключателе. Поэтому выполнение кода необходимо ограничить лишь блоком, для которого выявлено совпадение контрольного значения со значением проверяемого выражения. Как бы там ни было, но в языке
C# непустые case-блоки и блок default заканчиваются инструкцией break. Как и зачем используются пустые case-блоки - обсудим немного позже.
Несложно заметить, что в некотором смысле переключатель выбора напоминает блок из вложенных условных конструкций, хотя полной аналогии здесь, конечно, нет. Небольшой пример, в котором использован переключатель, представлен в примере ниже. Фактически это альтернативный способ реализации программы с вложенными условными конструкциями, в которой по введенному пользователем числу определяется название этого числа (см. пример 2 из 35 шага). Но на этот раз вместо условных конструкций использован переключатель switch.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using Microsoft.VisualBasic; namespace pr36_1 { class Program { static void Main() { // Переменная для запоминания введенного числа: int number; // Переменная для записи названия числа: string name; // Считывание числа: number = Int32.Parse( Interaction.InputBox( // Текст над полем ввода: "Введите число:", // Заголовок окна: "Число") ); // Использование переключателя для определения // названия введенного числа: switch (number) { case 1: // Если ввели число 1 name = "Единица"; // Название числа break; // Завершение блока case 2: // Если ввели число 2 name = "Двойка"; // Название числа break; // Завершение блока case 3: // Если ввели число 3 name = "Тройка"; // Название числа break; // Завершение блока case 4: // Если ввели число 4 name = "Четверка";// Название числа break; // Завершение блока default: // Ввели другое число name = "Неизвестное число"; break; // Завершение блока } // Завершение переключателя // Отображение сообщения MessageBox.Show(name, "Число"); } } }
Предыдущая версия программы была консольной. Эта версия для ввода числа и вывода сообщения использует диалоговые окна. Но это отличие "косметическое". Идеологически важное отличие состоит в том, что здесь мы используем переключатель switch. Целочисленная переменная number предназначена для записи числа, которое вводит пользователь. Текстовая переменная name нужна для того, чтобы сформировать и запомнить текстовое значение - название введенного пользователем числа. Для считывания числа используем статический метод InputBox() класса Interaction. Для преобразования текстового представления числа в целое число используем статический метод Parse() из структуры Int32. Результат записывается в переменную number.
Для проверки значения переменной number использован переключатель. Проверяемым выражением в нем является эта переменная. В case-блоках указаны контрольные значения - целые числа от 1 до 4 включительно (всего четыре case-блока). При наличии совпадения значения переменной number и контрольного значения в case-блоке получает значение переменная name (значение переменной - название введенного числа). На случай, если совпадения не будет, предусмотрен default-блок. В этом блоке значением переменной name присваивается текст, сообщающий о невозможности идентифицировать число.
Таким образом, было или не было совпадение, переменная name получит значение. Это значение используется в команде MessageBox.Show (name, "Число"), которая отображается диалоговое окно с сообщением (название числа или сообщение о том, что число неизвестно).
На рисунке 2 показано окно с полем ввода, в которое введено число 2.

Рис.2. В поле введено число 2
После подтверждения ввода появляется новое диалоговое окно, показанное на рисунке 3.

Рис.3. Окно с сообщением после ввода числа 2
Наа рисунке 4 показано окно с полем ввода, в котором пользователь указал число 5.

Рис.4. В поле введено число 5
После щелчка по кнопке ОК появляется окно с сообщением о том, что число неизвестно. Окно показано на рисунке 5.

Рис.5. Окно с сообщением после ввода числа 5
Стоит заметить, что если пользователь вместо ввода числа в окне с полем щелкнет, например, кнопку Отмена, то возникнет ошибка. Желающие могут подумать, как следует модифицировать программный код, чтобы подобная ситуация обрабатывалась корректно.
В программе использовано несколько пространств имен. Пространство имен System.Windows.Forms необходимо подключить для использования статического метода Show() из класса
MessageBox. Метод отображает диалоговое окно с сообщением (в данном случае название введенного пользователем числа). Пространство имен Microsoft.VisualBasic нужно для
использования статического метода InputBox() из класса Interaction. Метод отображает окно с полем ввода. Напомним, что в данном случае мы прибегаем к помощи средств
разработки языка Visual Basic. Наконец, пространство имен System нам понадобилось, поскольку мы используем статический метод Parse() из структуры Int32.
Вообще-то мы еще используем и текстовый тип String. Это класс из пространства имен System. Но в программе ссылка на текстовый тип выполнена через идентификатор string,
являющийся псевдонимом для инструкции System.String. Так что string можно было бы использовать и без подключения пространства имен System.
На следующем шаге мы закончим изучение этого вопроса.