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


этот вопрос уже есть ответ здесь:

  • Почему мне нужно использовать break? 5 ответов

при создании switch заявление в VS2008 C# вот так (надуманно):

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

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

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

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

4 83

4 ответа:

из уст лошади (MSDN) почему оператор c# switch предназначен для предотвращения провала, но все же требует перерыва?.

цитируя заметные биты, вот почему они не позволяют провалиться:

это неявное провальное поведение часто используется для уменьшения количества необходимого кода и часто не является проблемой при первом написании кода. Однако по мере перехода кода из начальной фазы разработки в фазу обслуживания, код выше может привести к тонким ошибкам, которые очень трудно отлаживать. Эти ошибки являются результатом очень распространенной ошибки разработчика, добавляющего случай, но забывающего поставить перерыв в конце блока.

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

и вот почему это не автоматически:

в результате правил C#, требующих явного управления потоком в конце блока case (чаще всего перерыв), многие люди задаются вопросом, почему поведение просто не было изменено таким образом, что провал не произошел. То есть, не делайте перерыв требуется, просто измените семантику switch, чтобы не иметь провал для случаев. Почему это не было сделано так, что разработчики, которые были очень раньше на C++ не было бы трудно понять, что делает оператор switch.

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

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

case '1':
{
}

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

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

это также может быть приятно иметь возможность перечислить несколько случаев больше просто:

case '0', '1':
{
}

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

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

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

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

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

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

Если у вас нет кода в случае 1, Вам разрешено провалиться, поэтому вы можете сказать ,что"все эти случаи разделяют этот кусок кода"