Почему компилятору c # требуется оператор break в конструкции switch? - PullRequest
12 голосов
/ 02 марта 2010

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

Почему это не встроенное поведение, чтобы сломаться после завершения дела? Разве это не просто синтаксис без семантики?

Извините, если это глупый вопрос.

РЕДАКТИРОВАТЬ: падение разрешено только тогда, когда дело пусто. Когда там есть оператор, вы не можете пропустить оператор break. Так что это другое дело.

Ответы [ 4 ]

10 голосов
/ 02 марта 2010

Компилятор не столько «нуждается» в операторах break, сколько требует их.

Это было дизайнерское решение, сравнимое с требованием использования ref при вызове метода с параметром передачи по ссылке.

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

3 голосов
/ 02 марта 2010

Оператор break в c # был дизайнерским решением создателей языка ... По сути, они хотели «однозначного» оператора break, оператора break, который работал бы только в одном направлении. Короче говоря, они не хотели провалиться, и если бы они просто предотвратили провал без включения «break», это нарушило бы обратную совместимость с c ++.

2 голосов
/ 31 января 2012

Падение допускается , если выражение регистра пустое:

case Foo:  // fallthrough allowed.
case Bar:
    Console.WriteLine ("Foo or Bar");
    break; // required

То, что это не разрешено, является распространенным заблуждением в той же лиге, что и «вы не можете назначать значения в условиях if» *


* Можно. Правило состоит в том, что в if-условиях допускаются только логические значения, а x=false с bool x; равно логическому значению.

0 голосов
/ 02 марта 2010

Обычно такой код является ошибкой:

// 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) метод и вызовите его оттуда.

Последнее замечание: падение пустых ящиков - это все, что ожидается от пустого ящика, поэтому оно разрешено.

...