Это не вопрос C #, а C * версия switch
, которая заставляет меня задать вопрос.
Почему я должен явно заявить, что я не хочу проваливаться из одного оператора case
в следующий вместо того, чтобы указывать, когда я действительно хочу провалиться?
В C # компилятор не позволит вам перейти от одного оператора case
к следующему (если только оператор case
не пуст), и все же он заставляет вас ставить явный break
в конце каждого оператора. один. Подавляющее большинство switch
утверждений, которые я пишу, не проваливаются.
int x = 4;
string result;
switch (x)
{
case 1:
result = "One";
break;
case 2:
result = "A couple";
break;
case 3:
case 4:
result = "Three or four";
break;
/*
case 5:
result = "Five"; // Here be an error! A common typo for me!!!
*/
default:
result = "Five or more";
break;
}
Приведенный выше пример придуман, чтобы показать возможности. Количество раз, когда я действительно проваливаюсь (как между 3 и 4 выше), минимально. Если я удалю комментарии из случая 5 выше, компилятор C # поймает это как ошибку. Почему я должен это исправить вручную, если компилятор прекрасно знает, что я пытаюсь сделать?
Не лучше ли следующее?
int x = 4;
string result;
switch (x)
{
case 1:
result = "One";
case 2:
result = "A couple";
case 3:
continue; // or even goto 4
case 4:
result = "Three or four";
/*
case 5:
result = "Five"; // This would not longer be an error!! Hooray!
*/
default:
result = "Five or more";
}
Позвольте мне прояснить, что я не защищаю провал здесь. Подразумевается break
в конце каждого case
оператора. Предполагается, что два примера являются функционально эквивалентными.
Компилятор все еще мог бы кричать на меня, если бы я забыл выражение continue
в случае 3. Хотя это случалось бы не очень часто, и я был бы рад за помощь. На самом деле, вероятность того, что я пропустил заполнение скелетного кода, в этом случае довольно высока. Полезно. Сказать мне, что я забыл заявление break
, никогда не помогает. Просто радует компилятор.
Похоже, что это, вероятно, просто задержка от C (что позволяет вам проваливаться, даже если у вас есть код в операторе case). Есть ли более глубокая причина, по которой я не вижу?
Я смотрел какой-то код компилятора только этим утром, и в switch
были сотни case
операторов, которые ничего не делали, кроме возврата операционных кодов. У каждого из них было break
заявление. Так много печатать и беспорядок ...
Что думают люди? Почему второй вариант не лучший по умолчанию?