В С# задан случай по умолчанию для переключения на перечисление?
Я видел сообщения относящиеся к С++, но я спрашиваю специально для С#.NET(4.0 +).
В следующем примере необходим случай по умолчанию?
public enum MyEnum : int
{
First,
Second
}
public class MyClass
{
public void MyMethod(MyEnum myEnum)
{
switch (myEnum)
{
case MyEnum.First: /* ... */ break;
case MyEnum.Second: /* ... */ break;
default: /* IS THIS NECESSARY??? */ break;
}
}
}
Ответы
Ответ 1
Это распространенное заблуждение, что значения .Net enum ограничены теми, которые были объявлены в Enum. В действительности, хотя они могут быть любым значением в диапазоне базового типа перечисления (int
по умолчанию). Например, совершенно законно
MyMethod((MyEnum)42);
Этот код будет компилироваться без предупреждений и не ударять ни о каких ваших меток case
.
Теперь, выбирает ли ваш код обращение с этим типом сценария, является политическим решением. Это не нужно, но я бы наверняка рекомендовал его. Я предпочитаю добавлять default
к каждому switch
в перечислении, которое я пишу специально для этого сценария со следующим шаблоном
switch (value) {
...
default:
Debug.Fail(String.Format("Illegal enum value {0}", value));
FailFast(); // Evil value, fail quickly
}
Ответ 2
Это не является строго необходимым, но кто-то может передать значение, не охватываемое вашим перечислением (поскольку перечисления фактически не ограничивают диапазон допустимых значений параметра).
Я обычно добавляю значение по умолчанию и throw
, если указанное значение неожиданно.
Ответ 3
Это не является технически необходимым, а потому, что вы можете легко присвоить значение MyEnum
базового типа (обычно int) экземпляру MyEnum
. Поэтому хорошей практикой является добавление в нее инструкции по умолчанию с Debug.Assert()
.
Ответ 4
Это не требуется, но хорошая практика, поскольку кто-то может ввести новое перечисление позже. Например, выведите исключение, указывающее, что "неизвестное" перечисление не обрабатывается.
Ответ 5
Нет, случай по умолчанию не требуется.
Ответ 6
С точки зрения чисто кода нет требования иметь случай default
. Это исключительно вопрос ваших логических требований.