С# Enums: значение Nullable или 'Unknown'?

Если у меня есть класс с членом enum, и я хочу иметь возможность представлять ситуации, когда этот член не определен, что лучше?

a) Объявите элемент как nullable в классе с использованием типов с нулевым значением. Например:

public SomeEnum? myEnum;

b) Добавьте значение перечисления по умолчанию, "неизвестное" в перечисление. Например:.

public enum SomeEnum {
    Unknown,
    SomeValueA,
    SomeValueB,
    SomeValueC,
}

Я не могу видеть никаких серьезных плюсов и минусов в любом случае; но, возможно, один предпочтительнее другого?

Ответ 1

Определенно используйте тип значений с нулевым значением - для чего они предназначены. В нем четко указано ваше намерение. Это также означает, что вы можете использовать Enum.IsDefined (или эквивалент от Unconstrained Melody, если вы хотите, чтобы общий тип безопасности), легко определить, является ли конкретное значение реальным значением, не беспокоясь о "поддельном" тоже.

Ответ 2

Я согласен с archimed7592 в том, что существует реальная разница между отсутствующим значением и значением "Неизвестно".

Пример:

"Каков ваш тип крови?"

  • Null = отсутствует значение → вопрос не ответил → задайте вопрос

  • "Неизвестный" → пациент указывает, что он не знает → заказать лабораторный тест на тип крови

Ответ 3

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

В случае необходимости представлять неизвестные значения, дополнительный член перечисления звучит хорошо как решение.

В случае необходимости представления отсутствия какого-либо значения сделайте его нулевым.

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

НТН.

Ответ 4

IT ЗАВИСИТ!

Билл Вагнер привел несколько веских причин добавить Undefined enum, когда это имеет смысл. Я предлагаю вам найти полный элемент, но здесь предварительный просмотр:

Пункт 8: Убедитесь, что 0 является допустимым состоянием для типов значений

Инициализация системы .NET по умолчанию устанавливает все объекты во все 0s. Вам не удастся помешать другим программистам создать экземпляр типа значения, который инициализируется для всех 0. Сделайте это значением по умолчанию для вашего типа.

Одним из особых случаев является перечисление. Никогда не создавайте перечисление, которое не включает 0 в качестве допустимого выбора. Все перечисления получены из System.ValueType. Значения для перечисления начинаются с 0, но вы можете изменить это поведение...

Теперь у меня есть ситуация, когда пользователям нужно выбрать какой-либо тип из ComboBox или у них не может быть выбран тип. Я использую enum с атрибутом [Description("a description")] в качестве объекта, который нужно выбрать. Если none/Unknown является естественным выбором для перечисления, я бы использовал это, чтобы представить, что ничего не выбрано. В противном случае я буду использовать Nullable<MyEnum>.

Ответ 5

Если он станет нулевым, вы получите его как значение по умолчанию, вы получите исключения, если попытаетесь использовать его, когда null (что хорошо!)

Ответ 6

Все изменяется, если перечисление связано с атрибутом [Flags].

    [Flags]
    enum FlagsEnum
    {
        None = 0,
        First = 1,
        Second = 2,
        Third = 4,
        FirstAndThird = 5
    }