Ответ 1
С# имеет значение goto case
, которое имеет все преимущества провала, но сложнее сделать это случайно.
Я только начинаю преподавать себе С#, и в учебнике по операторам Switch я читаю:
Поведение, при котором поток исполнения запрещен к потоку от одного блока корпуса к следующему - это одна область, в которой С# отличается от С++. В С++ обработка операторов case разрешается запускать из один к другому.
Почему он останавливается после одного случая в С#? Если вы можете использовать оператор break
для остановки в любой точке, есть ли какая-либо причина в С# или С++, чтобы остановить ее после того, как найдено совпадение? И если вам нужно больше одного случая в С#, вам нужно будет использовать другой оператор Switch?
С# имеет значение goto case
, которое имеет все преимущества провала, но сложнее сделать это случайно.
Технически это неверно: С# разрешает провал, когда тело 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/С++ делается по ошибке чаще, чем нет. Вот почему дизайнеры С# решили не допускать этого.
Я думаю, что аргумент состоит в том, что падение с помощью операторов switch в С++ обычно вызывало больше проблем, чем они решали. То есть когда они провалились, когда они не были намерены программистов, они просто забыли break
. Так что С# покончил с этим.
То же самое с множеством других "функций" на С++. Это не то, что они не были время от времени полезными, это просто, что чаще они были вредными. Подобно оценке всего, что угодно, как bool, поэтому в С# вы не можете делать:
if(1)
{
}
Поскольку оценка ints как bools вызвала много трудностей в поиске ошибок.
Версия на С# меньше подвержена ошибкам - ничто не будет взорваться на вашем лице, если вы забудете написать break
, что происходит. Это также выглядит немного приятнее. Опять же, есть очень мало оснований для использования операторов switch большую часть времени в любом случае (часто это просто заканчивается плохой реализацией диспетчеризации типа, которая встроена в оба языка через наследование класса).