На фазе проектирования разработчики
СП
взвешивали все "за" и "против", решая, какую функцию языка реализовать. Передача управления вниз (fall-through) — пример возможности, от которой разработчики отказались. Обычно в C++ оператор
case
выполняется, когда
выражение-константа
совпадает с
выражением-переключателем.
Затем оператор
break
передает управление за пределы оператора
Передача управления вниз, хотя она и не поддерживается в С#, полезна, когда у вас две case-метки и вторая метка представляет операцию, которая должна выполняться в любом случае. Например, я когда-то писал на C++ редактор БД, позволяющий пользователям применять графический интерфейс при создании таблиц и полей. Все таблицы отображались в окне с деревом вроде Windows Explorer. Когда пользователь щелкал правой кнопкой дерево, мне нужно было отображать меню с элементами наподобие "Печатать все таблицы " и "Создать новую таблицу". Если же пользователь щелкал правой кнопкой конкретную таблицу, нужно было отображать контекстное меню для этой таблицы. Но при этом хотелось, чтобы в меню входили и все те элементы, что отображаются для дерева. Концептуально мой код похож на этот:
// Динамическое создание меню в C++.
switch(itemSelected)
{
case TABLE:
// Добавляем параметры меню для текущей таблицы;
// break опущен преднамеренно.
case TREE_VIEW:
// Добавляем элементы меню для дерева.
break;
> -// Отображаем меню.
После первой case-метки выполнялась вторая, и мне не нужно было дублировать код или дважды обращаться к одному методу. Однако проектировщики языка С# решили, что, хотя такая возможность и удобна, ее достоинства не превышают связанного с ней риска, так как в большинстве случаев оператор
break
нечаянно упускается, что приводит к ошибкам, которые трудно отловить. В С# в рассмотренной ситуации, вероятно, лучше использовать оператор
if.
II
Динамическое создание меню, if (itentSelected == TABLE) {
// Добавляем параметры меню для текущей таблицы. }
// Добавляем элементы меню для дерева. // Отображаем меню.