Если перечисление начинается с 0 или 1?
представьте, что я определил следующее перечисление:
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
как лучше всего использовать перечисление? Должен ли он начинаться с 1 как в приведенном выше примере или начать с 0 (без явных значений) такой:
public enum Status : byte
{
Inactive,
Active
}
14 ответов:
Рекомендации По Проектированию Каркаса:
Do укажите нулевое значение в перечислении без флагов Если None не подходит для перечисления, то назначьте нулевое значение элементу, который следует использовать в качестве значения по умолчанию для перечисления.
избежать использование флаговых значений перечисления нормальные члены, которые являются отрицательными или нуль. .. Значение перечисления, равное нулю, создает проблемы с и операций и т. д.
ну, я думаю, что я не согласен с большинством ответов, которые говорят, чтобы явно не пронумеровать их. Я всегда явно нумерую их, но это потому, что в большинстве случаев я сохраняю их в потоке данных, где они хранятся как целочисленное значение. Если вы явно не добавляете значения, а затем добавляете новое значение, вы можете прервать сериализацию, а затем не сможете точно загрузить старые сохраненные объекты. Если вы собираетесь сделать какой-либо тип постоянного хранения этих значений, то я бы настоятельно рекомендуем явно задать значения.
перечисление-это тип значения, и его значение по умолчанию (например, для поля перечисления в классе) будет равно 0, если оно не инициализировано явно.
поэтому вы обычно хотите иметь 0 в качестве определенной константы (например, неизвестно).
в вашем примере, если вы хотите
Inactiveпо умолчанию, то он должен иметь нулевое значение. В противном случае вы можете рассмотреть возможность добавления константыUnknown.некоторые люди рекомендовали не указывать значения явно для ваших констант. Наверное, хороший совет в большинстве случаев, но есть некоторые случаи, когда вы хотите сделать так:
флаги перечисления
перечисления, значения которых используются при взаимодействии с внешними системами (например, COM).
Если у вас нет конкретной причины изменить его, оставьте перечисления со значениями по умолчанию, которые начинаются с нуля.
public enum Status : byte { Inactive, Active }
Я бы сказал, что лучше всего не нумеровать их и пусть это будет неявным - что начнется с 0. Поскольку его неявное его языковое предпочтение, которое всегда хорошо следовать :)
Я бы начал перечисление логического типа с 0.
Если "Inative" означает нечто иное, чем "неактивные" :)
Это сохраняет стандарт для тех.
Я бы сказал, Это зависит от того, как вы их используете. Для того, чтобы отмечать перечисление, это хорошая практика, чтобы иметь 0 для
Noneзначение, как это:[Flags] enum MyEnum { None = 0, Option1 = 1, Option2 = 2, Option3 = 4, All = Option1 | Option2 | Option3, }когда ваше перечисление, вероятно, будет сопоставлено с таблицей поиска базы данных, я бы начал его с 1. Это не должно иметь большого значения для профессионально написанного кода, но это улучшает читаемость.
в других случаях я бы оставил все как есть, не заботясь о том, начинаются ли они с 0 или 1.
если у вас нет веской причины использовать необработанные значения, вы должны использовать только неявные значения и ссылаться на них с помощью
Status.ActiveиStatus.Inactive.загвоздка в том, что вы можете хранить данные в плоском файле или БД, или использовать плоский файл или БД, которые кто-то другой создал. Если вы делаете это сами, сделайте так, чтобы нумерация соответствовала тому, для чего используется перечисление.
если данные не ваши, конечно, вы хотите использовать все, что оригинальный dev использовал в качестве схемы нумерации.
если вы планируете использовать перечисление в качестве набора флагов, есть простое соглашение, которое стоит следовать:
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. Для составных флагов (часто используемых для удобства) другие значения могут быть объединены с помощью побитового оператора or|.
Если начать с 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 };
если не указано нумерация начинается с 0.
важно быть явным, так как перечисления часто сериализуются и хранятся как int, а не строка.
для любого перечисления, хранящегося в базе данных, мы всегда явно нумеруем параметры, чтобы предотвратить смещение и переназначение во время обслуживания.
согласно Microsoft, рекомендуется использовать первый нулевой параметр для представления неинициализированного или наиболее распространенного значения по умолчанию значение.
Ниже приведен ярлык для начала нумерации в 1 вместо 0.
public enum Status : byte { Inactive = 1, Active }Если вы хотите установить значения флага, чтобы использовать битовые операторы для значений перечисления, не начинайте нумерацию с нулевого значения.
прежде всего, если вы не указываете конкретные значения по какой-либо причине (числовое значение имеет значение где-то еще, т. е. база данных или внешняя служба), то не указывайте числовые значения вообще и пусть они будут явными.
во-вторых, у вас всегда должен быть элемент с нулевым значением (в перечислениях без флагов). Этот элемент будет использоваться в качестве значения по умолчанию.
не запускайте их в 0, если нет причины, например, использовать их в качестве индексов для массива или списка, или если есть какая-то другая практическая причина (например, использование их в побитовых операциях).
код
enumследует начать именно там, где это необходимо. Он также не должен быть последовательным. Значения, если они явно заданы, должны отражать некоторое семантическое значение или практическое рассмотрение. Например,enumиз "бутылки на стене" должны быть пронумерованы от 1 до 99, в то время как Анenumдля степеней 4, вероятно, следует начинать с 4 и продолжать с 16, 64, 256 и т. д.кроме того, добавление нулевого элемента в
enumдолжно выполняться только в том случае, если оно представляет допустимое состояние. Иногда "нет", "неизвестно", "отсутствует" и т. д. допустимы значения, но во многих случаях они не являются.
Мне нравится начинать перечисления с 0, так как это значение по умолчанию, но мне также нравится включать неизвестное значение со значением -1. Затем это становится значением по умолчанию и иногда может помочь с отладкой.
Comments