Этот вопрос уже имеет ответ здесь:
Когда я создаю a switch
оператор в VS2008 C# как (изобретенный):
switch (state) {
case '1':
state = '2';
case '2':
state = '1';
}
это жалуется, что мне не разрешают отбросить через:
Управление не может провалиться от одной маркировки случая ('случай '1' (0x31)':) другому
Если Нельзя отбросить через, то, какова цель break
оператор вообще? Почему разработчики языка просто не пропустили его и автоматически перешли в конец switch
оператор вместо того, чтобы вынудить нас вставить ненужную конструкцию?
Из уст лошади (MSDN) Почему оператор switch в C# разработан так, чтобы не допускать выпадения, но при этом требовать прерывания?.
Цитируя основные фрагменты, вот почему они не разрешают переход:
Это неявное поведение перехода часто используется для сокращения объема кода и часто не является проблемой при первом написании кода. Однако, когда код переходит из начальной стадии разработки в стадию сопровождения, приведенный выше код может привести к тонким ошибкам, которые очень трудно отлаживать. Эти ошибки возникают из-за очень распространенной ошибки, когда разработчик добавляет case, но забывает поставить break в конце блока.
В C# оператор switch требует явного управления потоком в конце case - либо break, goto, return, либо throw. Если разработчик желает получить семантику fall-through, ее можно достичь с помощью явного goto в конце оператора case.
И вот почему это не происходит автоматически:
В результате правил C#, требующих явного управления потоком в конце блока case (чаще всего это break), многие задаются вопросом, почему поведение просто не было изменено таким образом, чтобы fall-through не происходило. То есть, не нужно делать break обязательным, просто измените семантику switch, чтобы не было fall-through для случаев. Это было сделано для того, чтобы разработчики, привыкшие к C++, не испытывали трудностей с пониманием того, что делает оператор switch.
Вам разрешено зайти, но вы должны сделать это явно с помощью ключевого слова goto
:
switch (state) {
case '1':
state = '2';
goto case '2';
case '2':
state = '1';
break;
}
Вы можете прервать
или goto
в C #, но то, что вы не можете сделать, это не указать то, что вы хотите, потому что это потенциальный источник трудно обнаруживаемых ошибок.
Намного легче обнаружить, что ваш код говорит goto
, когда вы хотели break
(или наоборот), чем обнаружить, что вы забыли добавить что-либо.
Это может показаться глупым, но многие утомительные двухчасовые поиски причины ошибки C ++ заканчиваются внезапным осознанием того, что вы забыли добавить разрыв
, и ваш код все время проваливается . C # избегает этого, заставляя вас указывать то, что вы хотите.
Если у вас нет кода в случае 1, вы можете провалиться, поэтому вы можете сказать, что «во всех этих случаях используется этот фрагмент кода»
В основном, чтобы сделать его более знакомым разработчикам на C / C ++ / Java. Лично я считаю, что это была ошибка, но причина в этом.
Я бы предпочел принудительную блокировку:
case '1':
{
}
Помимо всего прочего, это позволило бы избежать странных ситуаций определения области видимости переменных для switch / case. Конечно, у вас все еще может быть несколько меток падежа:
case '0':
case '1':
{
}
Также было бы неплохо иметь возможность более просто перечислить несколько вариантов:
case '0', '1':
{
}
Да, и небольшая придирка к вашему описанию существующего языка: вы не делаете У нет перерыва. Просто конец дела должен быть недосягаемым. Вы также можете использовать throw
, goto
или return
. Могу быть и другие, которых я тоже пропустил :)