У меня есть несколько блоков переключателей. У которых есть случай по умолчанию.
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# подберет его.
Проверяя архивы ECMA 334 с 2001 года (раздел 15.7.2), там это кажется действительным (хотя это не явно - просто нечего запрещать) - так что я думаю: всегда хорошо
1) в документах прямо указано, что это разрешено. 2) проверить это самостоятельно было бы быстрее, чем писать этот вопрос: dotnetfiddle.net/6rJSOD
Кстати, вам не нужны скобки - case 2: все в порядке
В спецификации 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
Почему бы просто не попробовать? Напишите несколько тестов и посмотрите, что произойдет.