Почему C# имеет повреждение, если это не является дополнительным? [дубликат]

Этот вопрос уже имеет ответ здесь:

Когда я создаю a switch оператор в VS2008 C# как (изобретенный):

switch (state) {
    case '1':
        state = '2';
    case '2':
        state = '1';
}

это жалуется, что мне не разрешают отбросить через:

Управление не может провалиться от одной маркировки случая ('случай '1' (0x31)':) другому

Если Нельзя отбросить через, то, какова цель break оператор вообще? Почему разработчики языка просто не пропустили его и автоматически перешли в конец switch оператор вместо того, чтобы вынудить нас вставить ненужную конструкцию?

91
задан CharlesB 5 January 2013 в 19:39
поделиться

4 ответа

Из уст лошади (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.

73
ответ дан 24 November 2019 в 06:43
поделиться

Вам разрешено зайти, но вы должны сделать это явно с помощью ключевого слова goto :

switch (state) {
    case '1':
        state = '2';
        goto case '2';
    case '2':
        state = '1';
        break;
}

Вы можете прервать или goto в C #, но то, что вы не можете сделать, это не указать то, что вы хотите, потому что это потенциальный источник трудно обнаруживаемых ошибок.

Намного легче обнаружить, что ваш код говорит goto , когда вы хотели break (или наоборот), чем обнаружить, что вы забыли добавить что-либо.

Это может показаться глупым, но многие утомительные двухчасовые поиски причины ошибки C ++ заканчиваются внезапным осознанием того, что вы забыли добавить разрыв , и ваш код все время проваливается . C # избегает этого, заставляя вас указывать то, что вы хотите.

46
ответ дан 24 November 2019 в 06:43
поделиться

Если у вас нет кода в случае 1, вы можете провалиться, поэтому вы можете сказать, что «во всех этих случаях используется этот фрагмент кода»

12
ответ дан 24 November 2019 в 06:43
поделиться

В основном, чтобы сделать его более знакомым разработчикам на C / C ++ / Java. Лично я считаю, что это была ошибка, но причина в этом.

Я бы предпочел принудительную блокировку:

case '1':
{
}

Помимо всего прочего, это позволило бы избежать странных ситуаций определения области видимости переменных для switch / case. Конечно, у вас все еще может быть несколько меток падежа:

case '0':
case '1':
{
}

Также было бы неплохо иметь возможность более просто перечислить несколько вариантов:

case '0', '1':
{
}

Да, и небольшая придирка к вашему описанию существующего языка: вы не делаете У нет перерыва. Просто конец дела должен быть недосягаемым. Вы также можете использовать throw , goto или return . Могу быть и другие, которых я тоже пропустил :)

87
ответ дан 24 November 2019 в 06:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: