Зачем вам ставить break после последней метки оператора switch? - PullRequest
4 голосов
/ 11 августа 2010

Конечно, компилятор знает, что это последняя метка оператора switch?

Ответы [ 9 ]

7 голосов
/ 11 августа 2010

Это потому, что в C ++ происходит следующее:

switch(a)
{
     case 1:
        // do stuff

     case 2:
        // do other stuff
}

Если a равно 1, тогда - согласно правилам C ++ - оба "делают вещи" и"делают другие вещи". Чтобы программисты на C ++, приходящие на C #, не сработали (и чтобы код был более понятным во всех отношениях), C # требует, чтобы вы явно указали, хотите ли вы break или перейдете на другую метку.

Теперь, что касается необходимости break в последнем блоке, это простой вопрос согласованности. Это также облегчает повторный факторинг: если вы перемещаете дела, вы внезапно не получите ошибки из-за пропущенного оператора break. Кроме того, что происходит, когда вы хотите добавить другую метку и т. Д. И т. Д.

6 голосов
/ 11 августа 2010

Хороший разрыв после последнего оператора case вашего коммутатора защитное программирование .Если, возможно, в будущем, будет добавлен еще один оператор case, он устраняет риск падения потока программы через из случая выше.

3 голосов
/ 11 августа 2010

Последовательность.Та же причина, что и возможность иметь запятую после последнего определения перечисления или последнего присваивания в операторе создания объекта с фигурными скобками.И последний случай не всегда может быть последним.

Это также делает так, чтобы было меньше особых случаев.

И если это так, то легче учиться, писатьили читать.Хотя это добавляет к согласованности вещь.

2 голосов
/ 11 августа 2010

На самом деле Есть один случай, когда вам не нужно ставить break

Рассмотрите этот код:

using System;

public class Program
{
    public static void DoStuff()
    {
    }

    public static void DoAnotherStuff()
    {
    }

    public static void Main()
    {
        switch(1)
        {
            case 1: DoStuff(); break;
            default: DoAnotherStuff();
        }
    }
}

Используя компилятор C # 4.0, он дает вам толькоХорошее CS0162: Предупреждение о недоступном коде

Похоже, что так как switch имеет постоянное выражение, компилятор уже знает, по какому пути он будет выполняться, а затем просто игнорирует метку dafault.что если вы измените switch (1) на switch (2), он больше не будет компилироваться, потому что у метки по умолчанию отсутствует разрыв.

Редактировать: Из C # Reference

В C # требуется, чтобы конец каждой секции коммутатора, включая последнюю, был недоступен.Хотя это требование обычно выполняется с помощью оператора перехода, следующий случай также допустим, потому что конец списка операторов не может быть достигнут.

case 4:
    while (true)
        Console.WriteLine("Endless looping. . . .");

Это объясняет, почему по умолчанию не требуетсяперерыв.На самом деле любой недостижимый ярлык не нуждается ни в разрыве, ни в возврате, ни в начало

2 голосов
/ 11 августа 2010

Согласно http://msdn.microsoft.com/en-us/library/06tc147t.aspx

Вы не можете «провалиться» ни в одну из секций переключателя, включая последнюю.

Любой изследующее: перерыв, переход или возврат.

2 голосов
/ 11 августа 2010

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

В C и C ++ операторы switch проходят через метки без перерыва. Когда пользователь четко говорит, что он хочет сделать, важно в C # избегать ошибок. Например, многие пользователи приходят на C # из C ++.


О последнем конкретном случае, в частности, о котором вы спрашиваете. Я могу придумать 3 веские причины.

  1. Важно, чтобы все было согласованно на любом языке.
  2. Что, если позже вы добавите еще один случай, что делать с дефолтом?
  3. Почему перерыв должен быть по умолчанию? Почему бы не пойти? Здесь есть двусмысленность.
1 голос
/ 11 августа 2010

При использовании switch, break - не единственная опция.У вас также есть возможность перейти к другому делу, перейти к делу по умолчанию, перейти к другой метке или вернуться.Также возможно иметь несколько случаев с одним телом реализации.Поскольку существует до пяти вариантов плюс возможность иметь несколько вариантов для одной реализации, компилятор не может просто вставить «правильный» ответ.

Вы должны выбрать, что вы собираетесь делать.Это гарантирует, что компилятор делает правильные вещи, делает ваш код более понятным, и делает более трудным выполнение глупых программистских вещей, таких как добавление еще одного случая после «последнего», и забыть вставить break / goto / return.

0 голосов
/ 16 марта 2013

Как уже упоминалось, вы можете использовать default :, но учитывайте также case null. case null: нужен перерыв;

case null: iEvaluatedToNothing (); перерыв;

Если вы хотите "водопад" вниз, вы можете сделать что-то вроде этого;

switch (deliverMail)
{
    case null:
    case "":
    case "Address0":
        deliverMail0();
        goto case "1";
    case "1":
        deliverMail1();
        break;
}

Вы можете использовать это с перерывами по мере необходимости, но один требуется при последней оценке.

0 голосов
/ 11 августа 2010

Согласно этой записи в блоге Эрика Липперта (случай 2), это позволяет вам произвольно переупорядочивать разделы коммутатора без случайного внесения критических изменений:

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

...