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

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

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
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
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 } 

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

Ссылка на спецификацию ECMA 334 C# и подробно на v1 от 2001 года в формате PDF

KargWare 10.01.2023 15:07

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