Представьте, что я определил следующее Enum:
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
Как лучше всего использовать enum? Должно ли оно начинаться с 1
примера, приведенного выше, или начинаться с 0
(без явных значений) следующим образом:
public enum Status : byte
{
Inactive,
Active
}
Ответы:
Руководство по проектированию рамок :
Руководство по проектированию рамок / Разработка перечислений флагов :
источник
switch
инструкциях оно перейдет кdefault
разделу, где я выбрасываю aInvalidEnumArgumentException
. В противном случае программа может непреднамеренно продолжить работу с нулевым значением перечисления, которое может быть допустимым и остаться незамеченным.Ну, я полагаю, что я не согласен с большинством ответов, в которых говорится, что я не должен их явно перечислять. Я всегда явно их нумерую, но это потому, что в большинстве случаев я сохраняю их в потоке данных, где они хранятся как целочисленные значения. Если вы не добавите значения явно, а затем добавите новое значение, вы можете прервать сериализацию, а затем не сможете точно загрузить старые сохраненные объекты. Если вы собираетесь делать какие-либо постоянные хранилища этих значений, я настоятельно рекомендую явно установить значения.
источник
Enum является типом значения, и его значение по умолчанию (например, для поля Enum в классе) будет 0, если не инициализировано явно.
Поэтому вы обычно хотите иметь 0 в качестве определенной константы (например, Неизвестно).
В вашем примере, если вы хотите
Inactive
быть значением по умолчанию, тогда оно должно иметь значение ноль. В противном случае вы можете рассмотреть возможность добавления константыUnknown
.Некоторые люди рекомендуют вам не указывать явно значения для ваших констант. Вероятно, в большинстве случаев это хороший совет, но в некоторых случаях вы захотите это сделать:
Флаги перечислений
Перечисления, значения которых используются во взаимодействии с внешними системами (например, COM).
источник
[Flags] enum MyFlags { None = 0, A, B, Both = A | B, /* etc. */ }
есть более читабельна, чем[Flags] enum MyFlags { None = 0, A = 1, B = 2, Both = 3, /* etc */ }
.)[Flags] enum MyFlags { None=0, A, B, C }
привело бы к[Flags] enum MyFlags { None=0, A=1, B=2, C=3 }
, тогда как для перечисления Flags вы обычно хотели бы C = 4.Если у вас нет особых причин изменить его, оставьте перечисления со значениями по умолчанию, которые начинаются с нуля.
источник
Я бы сказал, что лучшая практика - не нумеровать их и позволять им быть неявными - что начиналось бы с 0. Поскольку это неявное, это языковые предпочтения, которым всегда хорошо следовать :)
источник
Я бы начал перечисление логического типа с 0.
Если только «Inative» означает нечто иное, чем «Inactive» :)
Это сохраняет стандарт для тех.
источник
Я бы сказал, это зависит от того, как вы их используете. Для пометки enum рекомендуется иметь
None
значение 0 , например:Когда ваше перечисление может быть сопоставлено с таблицей поиска в базе данных, я бы начал с 1. Это не должно иметь большого значения для профессионально написанного кода, но это улучшает читаемость.
В других случаях я бы оставил все как есть, не заботясь о том, начинаются ли они с 0 или 1.
источник
Если у вас нет веской причины для использования необработанных значений, вам следует использовать только неявные значения и ссылаться на них с помощью
Status.Active
иStatus.Inactive
.Суть в том, что вы можете хранить данные в плоском файле или БД или использовать плоский файл или БД, созданные кем-то другим. Если вы делаете это самостоятельно, сделайте так, чтобы нумерация соответствовала тому, для чего используется Enum.
Если данные не ваши, конечно, вы захотите использовать то, что исходный разработчик использовал в качестве схемы нумерации.
Если вы планируете использовать Enum в качестве набора флагов, есть простое соглашение, которое стоит придерживаться:
Значения должны быть степенью двойки и могут быть выражены с использованием операций сдвига битов.
None
, очевидно, должно быть0
, ноAll
менее очевидно-1
.~0
является двоичным отрицанием0
и приводит к числу, для которого установлен каждый бит1
, который представляет значение-1
. Для составных флагов (часто используемых для удобства) другие значения могут быть объединены с использованием побитового или оператора|
.источник
Не назначайте никаких номеров. Просто используйте его так, как он должен быть использован.
источник
Если не указано, нумерация начинается с 0.
Важно быть явным, поскольку перечисления часто сериализуются и хранятся как int, а не как строка.
Для любого перечисления, хранящегося в базе данных, мы всегда явно нумеруем опции, чтобы предотвратить смещение и переназначение во время обслуживания.
Согласно Microsoft, рекомендуемое соглашение - использовать первый нулевой параметр для представления неинициализированного или наиболее распространенного значения по умолчанию.
Ниже приведен ярлык для начала нумерации с 1 вместо 0.
Если вы хотите установить значения флага для использования битовых операторов в значениях перечисления, не начинайте нумерацию с нулевого значения.
источник
Если вы начнете с 1, то вы можете легко получить количество ваших вещей.
Если вы начинаете с 0, то используйте первый как значение для неинициализированных вещей.
источник
Прежде всего, если вы не указываете конкретные значения по какой-либо причине (числовое значение имеет значение где-то еще, например, База данных или внешняя служба), тогда вообще не указывайте числовые значения и не допускайте их явного указания.
Во-вторых, у вас всегда должен быть элемент с нулевым значением (в перечислении без флагов). Этот элемент будет использоваться в качестве значения по умолчанию.
источник
Не начинайте их с 0, если для этого нет причин, таких как использование их в качестве индексов для массива или списка, или если есть какая-то другая практическая причина (например, использование их в побитовых операциях).
Вы
enum
должны начать именно там, где это необходимо. Это также не должно быть последовательным. Значения, если они установлены явно, должны отражать некоторое семантическое значение или практическое рассмотрение. Например,enum
«бутылки на стене» должны быть пронумерованы от 1 до 99, в то время какenum
для степеней 4, вероятно, они должны начинаться с 4 и продолжаться с 16, 64, 256 и т. Д.Кроме того, добавление элемента с нулевым значением в элемент
enum
следует выполнять только в том случае, если он представляет допустимое состояние. Иногда «нет», «неизвестно», «отсутствует» и т. Д. Являются допустимыми значениями, но часто это не так.источник
Я предпочитаю начинать перечисления с 0, так как это значение по умолчанию, но я также хотел бы включить значение Unknown со значением -1. Это тогда становится значением по умолчанию и может иногда помочь с отладкой.
источник