Использовать EnumType.None или Nullable<EnumType>?

Перечисления обычно используются для определения состояния определенного свойства класса, скажем, в какой-либо объектной модели. Для некоторых из этих свойств допустимо состояние "это свойство не установлено".

В этих ситуациях я должен использовать ноль None enum value или сделать тип свойства обнуляемым?

public MyEnum Property { get; set; }

public enum MyEnum {
    None = 0,
    Value1,
    Value2
}

или же

public MyEnum? Property { get; set; }

public enum MyEnum {
    Value1,
    Value2
}

4 ответа

Решение

Использование MyEnum.None - это гораздо более выразительно, или даже MyEnum.Invalid передать смысл.

Вы также можете установить для него значения, отличные от 0 - поскольку он основан на int, вы можете установить его равным -1, а первое допустимое значение равным 1:

public enum MyEnum {
    InvalidValue = -1,
    Value1 = 1,
    Value2
}

В своем коде вы можете легко проверить, передается ли это значение, и вызвать описательное исключение.

Обнуляемый тип enum не ожидается и менее выразителен. Пользователи кода должны знать об этом и проверять наличие нулей.

На это сложно ответить однозначно, на это будет влиять множество факторов в вашем приложении. Я склонен просто определять значение enum в 0, но не указывать нулевое значение в enum.

enum Foo 
{
   A = 1,
   B = 2
}

...

Foo myFoo = (Foo)0;

Это дает преимущество дозорного значения, не загрязняя перечисление.

Я бы использовал значение None вместо nullable enum. Если ничего другого, для меня if(Property == MyEnum.None) гораздо более читабельным, чем if(Property == null),

Другой вариант - установить первое значение равным 1, поскольку изначально оно будет равно 0.

public enum MyEnum {
    Value1 = 1,
    Value2
}

Я думаю, что обе ваши ситуации приемлемы! Это будет зависеть от вашей ситуации. При работе с пользовательским интерфейсом ваш первый пример со значением None, вероятно, будет проще в использовании. Однако Nullable дает больше информации о том, как следует использовать переменную.

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