Это не конкретно вопрос C#, но именно версия switch
для C# заставляет меня задать вопрос.
Почему я должен явно заявлять, что я не хочу переходить от одного оператора 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";
}
Позвольте мне прояснить, что я не выступаю за провал здесь. В конце каждого оператора case
подразумевается break
. Два примера должны быть функционально эквивалентны.
Компилятор все еще может накричать на меня, если я забуду оператор continue
в случае 3. Однако это случалось нечасто, и я был бы рад помощи. На самом деле, вероятность того, что я просто пропустил заполнение скелетного кода, в этом случае довольно высока. Полезный. Говорить мне, что я забыл оператор break
, никогда не бывает полезно. Это просто более занятая работа, чтобы сделать компилятор счастливым.
Похоже, что это, вероятно, просто удержание от C (что позволяет вам провалиться, даже если у вас есть код в операторе case). Есть ли более глубокая причина, которую я не вижу?
Только сегодня утром я просматривал код компилятора и обнаружил сотни case
операторов в switch
, которые ничего не делали, кроме как возвращали коды операций. У каждого из них было заявление break
. Столько писанины и хлама...
Что думают люди? Почему второй вариант не лучше по умолчанию?