Почему компилятор С# требует выражения break в конструкции коммутатора?
Мне сложно понять, почему компилятор требует использовать оператор break. Это невозможно пропустить, так как теперь разрешено падение. Я вижу причину разрыва на C или С++, но здесь он нужен.
Почему это не встроенное поведение для разрыва после завершения дела? Разве это не синтаксис без семантики?
Извините, если это глупый вопрос.
EDIT: провал разрешен только в том случае, если случай пуст. Когда есть инструкция, вы не можете опустить оператор break. Итак, это другое дело.
Ответы
Ответ 1
Компилятор не столько "нуждается" в операторах break, он требует их.
Это было конструктивное решение, сопоставимое с требованием использования ref
при вызове метода с параметром pass-by-reference.
Это сохраняет код семантически близко к C и С++, устраняя подводные камни завала через это всегда было спорным "функция" на языке Си.
Ответ 2
Оператор break в С# был дизайнерским решением создателей языка... По сути, они хотели "однозначный" оператор break, оператор break, который работал бы только одним способом. Короче говоря, они не хотели проваливаться, и если бы они просто предотвратили провал, не включив "перерыв", это сломало бы обратную совместимость с С++.
Ответ 3
Пауза разрешена, если выражение case пустое:
case Foo: // fallthrough allowed.
case Bar:
Console.WriteLine ("Foo or Bar");
break; // required
То, что это недопустимо, является распространенным заблуждением в той же лиге, что "вы не можете назначать значения в if-условиях" *
* Вы можете. Правило в том, что в if-условиях допускаются только логические значения, а x=false
с bool x;
- логическое значение.
Ответ 4
Обычно этот тип кода является ошибкой:
// Contrived calculator demostration
decimal x = 5m;
decimal y = 10m;
decimal result = 0m;
string blah = "Divide";
// .. other code omitted
switch(blah) {
case "Divide":
result = x / y;
case "Multiply":
result = x * y;
case "Add":
result = x + y;
case "Subtract":
result = x - y;
default:
MessageBox.Show("Not a valid operation");
}
Однако компилятор не может предположить, что недостающие перерывы являются ошибкой. Насколько ему известно, вы действительно хотели, чтобы дела проваливались.
Просто предполагая, что перерывы должны быть в конце каждого случая, будет просто обмениваться одной ошибкой для другой ошибки.
Итак, разработчики языка отказались от пропусков из непустых случаев и выбросили ошибку, если вы их опустите.
Если вам нужен код, разделяемый между непустыми случаями, поместите его в метод private
(возможно, static
) и вызовите его оттуда.
Одна последняя заметка: Пустые случаи, проваливающиеся, - это все, что должен делать пустой случай, поэтому это разрешено.