Различия между операторами switch в С# и С++

Я только начинаю преподавать себе С#, и в учебнике по операторам Switch я читаю:

Поведение, при котором поток исполнения запрещен к потоку от одного блока корпуса к следующему - это одна область, в которой С# отличается от С++. В С++ обработка операторов case разрешается запускать из один к другому.

Почему он останавливается после одного случая в С#? Если вы можете использовать оператор break для остановки в любой точке, есть ли какая-либо причина в С# или С++, чтобы остановить ее после того, как найдено совпадение? И если вам нужно больше одного случая в С#, вам нужно будет использовать другой оператор Switch?

Ответы

Ответ 1

С# имеет значение goto case, которое имеет все преимущества провала, но сложнее сделать это случайно.

Пример в MSDN

Ответ 2

Технически это неверно: С# разрешает провал, когда тело case пуст:

switch(val) {
case 1:
case 2:
    Console.WriteLine("small");
    break;
case 3:
case 4:
case 5:
case 6:
case 7:
    Console.WriteLine("medium");
    break;

 default:
    Console.WriteLine("large");
    break;
}

Разрешить неявное просачивание после того, как непустое тело в C/С++ делается по ошибке чаще, чем нет. Вот почему дизайнеры С# решили не допускать этого.

Ответ 3

Я думаю, что аргумент состоит в том, что падение с помощью операторов switch в С++ обычно вызывало больше проблем, чем они решали. То есть когда они провалились, когда они не были намерены программистов, они просто забыли break. Так что С# покончил с этим.

То же самое с множеством других "функций" на С++. Это не то, что они не были время от времени полезными, это просто, что чаще они были вредными. Подобно оценке всего, что угодно, как bool, поэтому в С# вы не можете делать:

if(1) 
{

}

Поскольку оценка ints как bools вызвала много трудностей в поиске ошибок.

Ответ 4

Версия на С# меньше подвержена ошибкам - ничто не будет взорваться на вашем лице, если вы забудете написать break, что происходит. Это также выглядит немного приятнее. Опять же, есть очень мало оснований для использования операторов switch большую часть времени в любом случае (часто это просто заканчивается плохой реализацией диспетчеризации типа, которая встроена в оба языка через наследование класса).