Может ли случай `по умолчанию` быть в середине или в начале переключателя?

У меня есть несколько блоков переключателей. У которых есть случай по умолчанию.

default обычно размещается в «конце» секции переключателя. Как в этом примере

switch(n)
{
    case 1: 
        // code for case 1 here...
        break;
    case 3: 
        // code for case 3 here...
        break;
    case 2:
    default: 
        // code here is for default and case 2
        break;
}

Я знаю, что case 2 можно было бы опустить, но мы в команде решили оставить все возможные случаи в переключателе.

С другой стороны, я хотел бы иметь порядок 1, 2 и 3.

Итак, мой вопрос: могу ли я переместить значение по умолчанию в middle переключателя? Я нашла на msdn - the-switch-statement, что по умолчанию можно ставить везде.

Регистр по умолчанию может появиться в любом месте оператора switch. Независимо от его положения, случай по умолчанию всегда оценивается последним и только в том случае, если все другие шаблоны случая не совпадают, за исключением случаев, когда встречается goto default.

switch(n)
{
    case 1: 
        // code for case 1 here...
        break;
    case 2:
    default: 
        // code here is for default and case 2
        break;
    case 3: 
        // code for case 3 here...
        break;
}

Или можно было бы даже изменить порядок или case 2 и по умолчанию?

switch(n)
{
    case 1: 
        // code for case 1 here...
        break;
    default: 
    case 2:
        // code here is for default and case 2
        break;
    case 3: 
        // code for case 3 here...
        break;
}

Последний фрагмент кода сохраняет «порядок», а также показывает, что «2» совпадает со значением по умолчанию. Мне это больше всего нравится из-за удобочитаемости.

Мой вопрос, сохраняется ли размещение «по умолчанию» в середине блока переключателей? Или это было введено в более поздней версии С#?

Из комментариев... Добавил свой тест-метод

        [TestMethod]
        public void SwitchMethodWithDefaultsInMiddle()
        {
            Func<int, string> func = (n) => {
                string ret = "";
                switch (n)
                {
                    case 1:
                        // code for case 1 here...
                        ret = "case 1";
                        break;
                    default:
                    case 2:
                        // code here is for default and case 2
                        ret = "case 2 or default";
                        break;
                    case 3:
                        // code for case 3 here...
                        ret = "case 3";
                        break;
                }
                return ret;
            };

            Assert.AreEqual("case 1", func(1));
            Assert.AreEqual("case 2 or default", func(2));
            Assert.AreEqual("case 3", func(3));

            Assert.AreEqual("case 2 or default", func(0));
            Assert.AreEqual("case 2 or default", func(4));
        }

Могу ли я перефразировать свой вопрос: подходит ли этот код для всех версий С#, а не только для моей текущей? Мой текущий код должен быть частью code-docu/guidelines, так что может кто-то с более старой версией VS или C# подберет его.

почему бы просто не попробовать? Напишите несколько тестов и посмотрите, что произойдет.

MakePeaceGreatAgain 10.01.2023 14:02

проверяя архивы ECMA 334 с 2001 года (раздел 15.7.2), там это кажется действительным (хотя это не явно - просто нечего запрещать) - так что я думаю: всегда хорошо

Marc Gravell 10.01.2023 14:05

1) в документах прямо указано, что это разрешено. 2) проверить это самостоятельно было бы быстрее, чем писать этот вопрос: dotnetfiddle.net/6rJSOD

Agent_L 10.01.2023 14:06

Кстати, вам не нужны скобки - case 2: все в порядке

Marc Gravell 12.01.2023 07:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В спецификации ECMA 334 С#, 1-е издание от 2001 г., есть пример именно этого на стр. 187, раздел 15.7.2:

32 switch (i) {
33 default:
34    CaseAny();
35    break;
36 case 1:
37    CaseZeroOrOne();
38    goto default;
39 case 0:
40    CaseZero();
41    goto case 1;
42 } 

так: это всегда было действительным

Другие вопросы по теме