В C # требуется ли регистр по умолчанию при включении перечисления? - PullRequest
26 голосов
/ 17 декабря 2010

Я видел сообщения , относящиеся к C ++ , но прошу специально для C # .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;
        }
    }
}

Ответы [ 7 ]

32 голосов
/ 17 декабря 2010

Распространено заблуждение, что значения перечисления .Net ограничены значениями, объявленными в Enum.В действительности они могут иметь любое значение в диапазоне базового типа перечисления (int по умолчанию).Например, следующее абсолютно законно

MyMethod((MyEnum)42);

Этот код будет скомпилирован без предупреждений и не попадет ни на одну из ваших case меток.

Теперь решение о том, будет ли ваш код обрабатывать сценарии такого типа, является политическим решением.Это не необходимо , но я бы определенно рекомендовал иметь его.Я предпочитаю добавлять default к каждому switch в enum, который я пишу специально для этого сценария со следующим шаблоном

switch (value) { 
  ...
  default: 
    Debug.Fail(String.Format("Illegal enum value {0}", value));
    FailFast();  // Evil value, fail quickly 
}
13 голосов
/ 17 декабря 2010

Это не является строго обязательным, но кто-то может передать значение, не охватываемое вашим перечислением (поскольку перечисления фактически не ограничивают диапазон допустимых значений параметров).

Обычно я добавляю значение по умолчанию и throwесли указанное значение является неожиданным.

6 голосов
/ 17 декабря 2010

Это не является технически необходимым, но поскольку вы можете легко привести значение базового типа MyEnum (обычно int) к экземпляру MyEnum. Следовательно, рекомендуется добавить оператор по умолчанию с Debug.Assert().

5 голосов
/ 17 декабря 2010

Это не обязательно, но это хорошая практика, так как кто-то может позже ввести новое перечисление. Например, сгенерировать исключение, которое указывает, что «неизвестное» перечисление не обрабатывается.

3 голосов
/ 17 декабря 2010

Нет, регистр по умолчанию не требуется.

0 голосов
/ 13 июня 2018

Это необходимо, если вы приведете к enum неопределенное значение (не будет выбрасывать исключение), а также если вы добавите дополнительные значения в enum.

0 голосов
/ 17 декабря 2010

С чисто кодовой точки зрения не требуется иметь default кейс.Это зависит только от ваших логических требований.

...