Поиск

Оператор switch без передачи управления вниз

На фазе проектирования разработчики СП взвешивали все "за" и "против", решая, какую функцию языка реализовать. Передача управления вниз (fall-through) — пример возможности, от которой разработчики отказались. Обычно в C++ оператор case выполняется, когда выражение-константа совпадает с выражением-переключателем. Затем оператор break передает управление за пределы оператора switch. Передача управления вниз означает, что при отсутствии break будет выполняться следующий оператор case, содержащийся в switch.

Передача управления вниз, хотя она и не поддерживается в С#, полезна, когда у вас две case-метки и вторая метка представляет операцию, которая должна выполняться в любом случае. Например, я когда-то писал на C++ редактор БД, позволяющий пользователям применять графический интерфейс при создании таблиц и полей. Все таблицы отображались в окне с деревом вроде Windows Explorer. Когда пользователь щелкал правой кнопкой дерево, мне нужно было отображать меню с элементами наподобие "Печатать все таблицы " и "Создать новую таблицу". Если же пользователь щелкал правой кнопкой конкретную таблицу, нужно было отображать контекстное меню для этой таблицы. Но при этом хотелось, чтобы в меню входили и все те элементы, что отображаются для дерева. Концептуально мой код похож на этот:

// Динамическое создание меню в C++.
switch(itemSelected)
{
case TABLE:
// Добавляем параметры меню для текущей таблицы;
// break опущен преднамеренно.
case TREE_VIEW:
// Добавляем элементы меню для дерева.
break;
> -// Отображаем меню.

После первой case-метки выполнялась вторая, и мне не нужно было дублировать код или дважды обращаться к одному методу. Однако проектировщики языка С# решили, что, хотя такая возможность и удобна, ее достоинства не превышают связанного с ней риска, так как в большинстве случаев оператор break нечаянно упускается, что приводит к ошибкам, которые трудно отловить. В С# в рассмотренной ситуации, вероятно, лучше использовать оператор if.

II Динамическое создание меню, if (itentSelected == TABLE) {
// Добавляем параметры меню для текущей таблицы. }
// Добавляем элементы меню для дерева. // Отображаем меню.