Должен ли Enum начинаться с 0 или 1? - PullRequest
128 голосов
/ 31 августа 2011

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

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

Как лучше всего использовать enum?Должно ли оно начинаться с 1, как в примере выше, или с 0 (без явных значений), например:

public enum Status : byte
{
    Inactive,
    Active
}

Ответы [ 14 ]

152 голосов
/ 31 августа 2011

Руководство по проектированию фреймворка:

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

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

61 голосов
/ 31 августа 2011

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

14 голосов
/ 31 августа 2011

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

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

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

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

* * 1010

Флаги-перечисления

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

14 голосов
/ 31 августа 2011

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

public enum Status : byte
{
    Inactive,
    Active
}
5 голосов
/ 31 августа 2011

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

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

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

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

5 голосов
/ 31 августа 2011

Я бы начал перечисление логического типа с 0.

Если "Inative" означает что-то отличное от "Inactive":)

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

5 голосов
/ 31 августа 2011

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

4 голосов
/ 31 августа 2011

Если у вас нет веских оснований для использования необработанных значений, вам следует использовать только неявные значения и ссылаться на них с помощью 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.Для составных флагов (часто используемых для удобства) другие значения могут быть объединены с использованием побитового или оператора |.

2 голосов
/ 24 июля 2017

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

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

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

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

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

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

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

2 голосов
/ 31 августа 2011

Если вы начнете с 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
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...