Использовать 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 дает больше информации о том, как следует использовать переменную.