Если Enum начинается с 0 или 1?

Представьте, что я определил следующий Enum:

public enum Status : byte
{
    Inactive = 1,
    Active = 2,
}

Какая наилучшая практика использования перечисления? Если он начинается с 1, как в приведенном выше примере, или начинайте с 0 (без явных значений) следующим образом:

public enum Status : byte
{
    Inactive,
    Active
}

Ответ 1

Руководство по разработке каркаса:

  • Do укажите значение нуля в списке не-флажков Если None не подходит для перечисления, то присвойте нулевое значение элементу, который должен использоваться как значение по умолчанию для перечисления.

  • Избегайте с использованием значений перечисления флага нормальных членов, которые являются отрицательными или нуль... Нумерованное значение нуля создает проблемы с операции и т.д.

Ответ 2

Ну, я думаю, что я не согласен с большинством ответов, которые говорят, что они явно не указывают их. Я всегда явно их номера, но это потому, что в большинстве случаев я в конечном итоге сохраняю их в потоке данных, где они хранятся в виде целочисленного значения. Если вы явно не добавляете значения, а затем добавляете новое значение, вы можете сломать сериализацию, а затем не сможете точно загружать старые сохраненные объекты. Если вы собираетесь делать какие-либо постоянные хранилища этих значений, я бы настоятельно рекомендовал явно устанавливать значения.

Ответ 3

An Enum - это тип значения, и его значение по умолчанию (например, для поля Enum в классе) будет 0, если оно явно не инициализировано.

Поэтому вы обычно хотите иметь 0 как определенную константу (например, неизвестную).

В вашем примере, если вы хотите, чтобы Inactive был значением по умолчанию, он должен иметь значение 0. В противном случае вы можете захотеть добавить константу Unknown.

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

  • Перечисления флагов

  • Перечисления, значения которых используются во взаимодействии с внешними системами (например, COM).

Ответ 4

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

public enum Status : byte
{
    Inactive,
    Active
}

Ответ 5

Я бы сказал, что лучшая практика состоит в том, чтобы не зацикливать их и позволить им быть неявным - что начиналось бы с 0. Так как его неявное предпочтение языка, которое всегда хорошо следует:)

Ответ 6

Я бы начал перечисление типа boolean с 0.

Если "Inative" означает нечто иное, чем "Неактивное":)

Это сохраняет стандарт для них.

Ответ 7

Я бы сказал, это зависит от того, как вы их используете. Для отметки перечисления полезно использовать значение 0 для None, например:

[Flags]
enum MyEnum
{
    None = 0,
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    All = Option1 | Option2 | Option3,
}

Когда ваше перечисление, вероятно, будет сопоставлено с таблицей поиска базы данных, я бы начал ее с 1. Это не должно иметь большого значения для профессионально написанного кода, но это улучшает читаемость.

В других случаях я оставил бы это как есть, не заботясь, начинают ли они с 0 или 1.

Ответ 8

Не назначайте числа. Просто используйте его так, как будто он должен использоваться.

Ответ 9

Если у вас нет оснований использовать исходные значения, вы должны использовать только неявные значения и ссылаться на них с помощью Status.Active и Status.Inactive.

Уловка заключается в том, что вы можете хранить данные в плоском файле или БД или использовать плоский файл или БД, которые кто-то создал. Если вы делаете это самостоятельно, сделайте так, чтобы нумерация соответствовала тому, для чего используется Enum.

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

Если вы планируете использовать Enum как набор флагов, существует простое соглашение, которое стоит:

enum Example
{
  None      = 0,            //  0
  Alpha     = 1 << 0,       //  1
  Beta      = 1 << 1,       //  2
  Gamma     = 1 << 2,       //  4
  Delta     = 1 << 3,       //  8
  Epsilon   = 1 << 4,       // 16
  All       = ~0,           // -1
  AlphaBeta = Alpha | Beta, //  3
}

Значения должны быть двухзначными и могут быть выражены с помощью операций бит-сдвига. None, очевидно, должно быть 0, но All менее очевидно -1. ~0 является двоичным отрицанием 0 и приводит к числу, которое имеет каждый бит, установленный в 1, который представляет значение -1. Для составных флагов (часто используемых для удобства) другие значения могут быть объединены с использованием побитового или оператора |.

Ответ 10

Если вы начинаете с 1, вы можете легко подсчитать свои вещи.

{
    BOX_THING1     = 1,
    BOX_THING2     = 2,
    BOX_NUM_THING  = BOX_THING2
};

Если вы начинаете с 0, используйте первый вариант как значение для неинициализированных вещей.

{
    BOX_NO_THING   = 0,
    BOX_THING1     = 1,
    BOX_THING2     = 2,
    BOX_NUM_THING  = BOX_THING2
};

Ответ 11

Если не указанная нумерация начинается с 0.

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

Для любого перечисления, хранящегося в базе данных, мы всегда явно указываем параметры для предотвращения переключения и переназначения во время обслуживания.

Согласно Microsoft, в рекомендуемом соглашении используется первая нулевая опция для представления неинициализированного или наиболее распространенного значения по умолчанию.

Ниже приведен ярлык для начала нумерации в 1 вместо 0.

public enum Status : byte
{
    Inactive = 1,
    Active
}

Если вы хотите установить значения флагов, чтобы использовать операторы битов для значений enum, не начинайте нумерацию с нулевым значением.

Ответ 12

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

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

Ответ 13

Не начинайте их с 0, если нет причины, например, использовать их в качестве индексов для массива или списка или если есть какая-то другая практическая причина (например, использование их в побитовых операциях).

Ваш enum должен начинаться именно там, где ему нужно. Это также не должно быть последовательным. Значения, если они явно заданы, должны отражать некоторый смысловой смысл или практическое рассмотрение. Например, enum "бутылок на стене" должен быть пронумерован от 1 до 99, а enum для полномочий 4 должен начинаться с 4 и продолжать с 16, 64, 256 и т.д.

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

Ответ 14

Мне нравится запускать свои перечисления в 0, так как это значение по умолчанию, но мне также нравится включать Неизвестное значение со значением -1. Затем он становится стандартным и иногда может помочь при отладке.