Шаг 36.
Язык программирования C#. Начала
Управляющие инструкции. Переключатель switch

    На этом шаге мы рассмотрим особенности использования этого переключателя.

    Переключатель 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.

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг