Использовать EnumType.None или Nullable <EnumType>? - PullRequest
0 голосов
/ 25 августа 2010

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

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

public MyEnum Property { get; set; }

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

или

public MyEnum? Property { get; set; }

public enum MyEnum {
    Value1,
    Value2
}

Ответы [ 4 ]

6 голосов
/ 25 августа 2010

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

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

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

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

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

0 голосов
/ 25 августа 2010

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

public enum MyEnum {
    Value1 = 1,
    Value2
}

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

0 голосов
/ 25 августа 2010

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

0 голосов
/ 25 августа 2010

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

enum Foo 
{
   A = 1,
   B = 2
}

...

Foo myFoo = (Foo)0;

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

...