Зачем объявлять числовые значения для перечислений? - PullRequest
3 голосов
/ 29 июля 2011

Я часто вижу простые (не флаги) перечисления, объявленные так:

enum Something
{
    Thingy = 1,
    Thangamijig = 2,
    Whatsit = 3
}

Зачем включать необязательные числовые значения? Это считается лучшей практикой?

Рекомендации MSDN по созданию перечислений , похоже, не объясняют причину этого.

Потенциальный ответ только что возник у меня: он должен гарантировать, что ранее сериализованные объекты, содержащие экземпляры перечисления, не станут недействительными или их значение изменится, если перечисление будет изменено (скажем, путем переупорядочения значений или вставки нового значение)?

Это кажется правдоподобным. Есть ли другие причины?

Ответы [ 6 ]

7 голосов
/ 29 июля 2011

Это очень важно, если вы собираетесь сохранить эти значения извне, например, в базе данных, и хотите отобразить их значения обратно в код.

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


Например:

enum Something
{
    Thingy,
    Thangamijig,
    Whatsit
}

Итак Thingy == 0, Thanamijig == 1, Whatsit == 2

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

enum Something
{
    Whosits,
    Thingy,
    Thangamijig,
    Whatsit
}

Сейчас Thingy == 1, Thanamijig == 2, Whatsit == 3 и вы нетбольше иметь правильное отображение.

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


определение перечисленияв MSDN

Базовым типом элементов перечисления по умолчанию является int.По умолчанию первый перечислитель имеет значение 0, а значение каждого последующего перечислителя увеличивается на 1. Например:

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

В этом перечислении Sat равен 0, Sun1, понедельник 2 и т. д.Перечислители могут иметь инициализаторы для переопределения значений по умолчанию.Например:

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

В этом перечислении последовательность элементов должна начинаться с 1 вместо 0.

4 голосов
/ 29 июля 2011

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

Например, программа COM или внешний веб-сервис могут определять определенные числовые значения для свойства, которое вы решите представить как перечисление в C #.

3 голосов
/ 29 июля 2011

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

По умолчанию перечисления начинаются с 0, поэтому, если у вас есть переменные, которые должны иметь некоторые значения, вы должны иметь числовое значение. Иногда вы увидите, что люди используют первый элемент как None, потому что он имеет значение 0.

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

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}
class MyClass
{
    Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
}
1 голос
/ 29 июля 2011

Важно, когда вы где-то храните значения enum, это может быть база данных, файлы конфигурации и т. Д. *

Представьте, что изначально у вас есть перечисление, подобное этому

enum TransactionType
{
  Debt,
  Deposit
}

И сохраненный TransactionType для ClientA как TransactionType.Deposit ( int value 1 ) в базе данных.

Позже другой разработчик добавил новый тип, поэтому enum теперь выглядит как

enum TransactionType
{  
  NotAssigned,
  Debt,
  Deposit
}

Таким образом, когда приложение считывает тип транзакции для ClientA из базы данных ( int == 1 ), оно становится равным TransactionTYpe.Debt.

ClientA будет сбит с толку, потому что вместо депозита он увидит в онлайн-системе, что у него есть долг.

Чтобы избежать таких проблем, вы должны добавить начальные значения.

1 голос
/ 29 июля 2011

Подумайте о большей базе данных.

Допустим, у вас есть массив константных строк, например 250 строк.

Но в какой-то части вашего кода вы на самом деле не хотите использовать все эти строки, а, например, только последние 3 из них.
Эта функция позволяет вам сделать это:

enum LastThree
{
    Thingy = 247,
    Thangamijig = 248,
    Whatsit = 249
}
1 голос
/ 29 июля 2011

Часто при взаимодействии с другим кодом.Иногда аппаратные средства, которые имеют предопределенные значения для перечислений.

Иногда люди используют их в качестве флагов, значения 0,1,2,4 ... тогда они могут быть ИЛИ вместе с int.Позже int можно проверить на перечисления.

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