Оператор switch

Другим средством ветвления является оператор switch. Он реализует выбор одного из нескольких заранее подготовленных вариантов. Его конструкция такова:

switch (<Выражение>)

{

case <Константсное_выражение_1>:

<Операторы_1>;

<Оператор_перехода_1>;

case <Константсное_выражение_2>:

<Операторы_2>;

<Оператор_перехода_2>;

...

case <Константсное_выражение_К>:

<Операторы_К>;

<Оператор_перехода_К>;

default:

<Операторы_N>;

<Оператор_перехода_N>;

}

Здесь switch, case, default — зарезервированные слова; <Выражение> — выражение; <Константное_выражение_Х> — произвольное константное выражение того же типа, что и <Выражение>; <Операторы_Х> — произвольные операторы или блоки операторов; <Оператор_перехода_Х> — оператор break или goto.

Оператор работает следующим образом. Вначале вычисляется значение управляющего выражения <Выражение>. Затем вычисленное значение последовательно сравнивается с константными выражениями, начиная с самого первого. Если значения совпали, выполняется последовательность соответствующих операторов и оператор перехода. Если ни одна ветвь case не выбрана, выполняется ветвь default. Эта ветвь может отсутствовать — в этом случае оператор завершает свою работу.

Выбранная ветвь case может быть пустой. В этом случае выполняются операторы ближайшей следующей непустой ветви.

Оператор switch является постоянным объектом критики. Основная причина — возможность использования оператора goto. Этот оператор может передать управление в другую ветвь case, та в еще одну и т. д., что означает потенциальную опасность создания сложных в понимании и отладке программ. Следует заметить, что этот оператор заимствован из языка С++, в котором он еще хуже. В С++ разрешается не ставить оператор перехода в качестве последнего оператора ветви case (хотя на практике она обычно завершается оператором break). В результате сразу за выбранной ветвью начинает выполняться следующая. Возможно, некоторым программистам этот прием понравится, но он делает логику программы запутанной. Борясь с этим, авторы С# потребовали обязательного включения оператора перехода — его отсутствие блокируется компилятором. Но в других языках программирования (в Visual Basic, например), появление очередной ветви case означает автоматическое завершение выполнения оператора, то есть наличие неявного оператора break. В языке С# это не так, за что его и критикуют.

Другой недостаток — отсутствие возможности задания диапазона выбора, В языке Visual Basic аналогичный оператор допускает задание диапазона с помощью определения списка константных выражений. В С# этого сделать нельзя. Если понадобится выбирать диапазон значений, приходится предварительно формировать вспомогательную переменную с помощью операторов if. Пусть, например, переменная age указывает возраст человека. Тогда в С# для отнесения человека к той или иной возрастной группе необходимо проделать, например, такую вспомогательную работу:

int ptriod;

if ((age >= 0) && (age < 7)) period = 1;

if ((age > 7) && (age < 17)) period = 2;

if ((age >= 17) && (age < 25)) period = 3;

if ((age >= 25) && (age < 50)) period = 4;

if ((age >= 50) && (age < 80)) period = 5;

if (age >= 80) eriod = 6;

switch period

{

case 1: Console.WriteLine("ребенок"); break;

case 2: Console.WriteLine("школьник"); break;

case 3: Console.WriteLine("юноша"); break;

case 4: Console.WriteLine("взрослый человек"); break;

case 5: Console.WriteLine("пожилой человек"); break;

case 6: Console.WriteLine("старый человек"); break;

}

Предлагаю ознакомиться с аналогичными статьями: