Другим средством ветвления является оператор 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;
}
0 коммент.:
Отправить комментарий