2012-05-15 3 views
6

У меня есть группа значений, которые представляют состояние (ON, OFF, READY, ...). Эти значения также сохраняются в БД как int-поле, поэтому мне интересно, скажут ли лучшие практики, что это перечисление или просто куча типов const int в классе.C# Enum или int const

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

Каков наилучший подход?

+1

Это верно и для целых чисел! Вы можете установить значение, которое вы хотите для каждого перечисления, и компилятор будет выполнять (немного) ваш код. По крайней мере, вы не сможете написать: myVar.MyEnum = 12345; –

+1

Я бы попробовал 'enum' для вашего примера. Pi - постоянная, как и скорость света. По моему скромному мнению, ваш набор состояний не является. – Ste

ответ

10

Я думаю, что enum по-прежнему является лучшим выбором для удобочитаемости. Однако, поскольку его значения откладываются в БД, вы должны указать значения в явном виде:

enum State { On = 1, Off = 2, Ready = 3}; 
+0

+1 @OxedFrederik не просто ** объявить ** перечисление, а в вашей модели ** проверить ** это действительно. Вы можете применить любое целое число к перечислению. Лично мне понравилось решение, отправленное Кевином. –

0

Вы можете определить значения Enum себя тоже, а именно:

enum STATE {ON=2, OFF=9, READY=14}; 
3

Как кто-то добавляет новый перечисление значение, отличное от новой константы int?

Помните, что вы можете установить перечисление на определенное целочисленное значение.

Embrace читаемость!

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

Widget.state = 474; 

Где 474 не соответствует состоянию в базе данных.

+0

Это правда, но наиболее волатильная область для этого типа вещей находится на границах приложений, где происходит сериализация. Это означает, что вы заканчиваете такими утверждениями, как 'Widget.state = (StateEnum) stateId', а C# делает ** не ** ухаживать, если' stateId' является допустимым значением в 'StateEnum' и будет ** не ** вызывать исключение, если 'stateId' - 474. – Nick

+0

@ Ник-да, дезинфицируйте свои входы. [Есть даже методы перечисления, чтобы помочь в этом.] (Https://msdn.microsoft.com/en-us/library/system.enum.isdefined.aspx) – MushinNoShin

1

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

Опасность, связанная с связью const int, заключается в том, что тип не указывает на то, что действительные значения, и кто-то может очень легко назначить любое старое значение. Злоумышленник вашего кода все равно мог сделать это с помощью броска, но вы не можете остановить некоторых людей от стрельбы самостоятельно на своей ноге ...

0

Я бы сказал, Enums. Они предоставляют вам формат машины в удобном для восприятия формате. Убедитесь, что вы хорошо документировали это так

///Summary 
/// About State Enum 
///Summary 
enum State : int 
{ 
    ///Summary 
    /// About Off Enum Value 
    ///Summary 
    Off = 0, 
    ///Summary 
    /// About On Enum Value 
    ///Summary 
    On, 
    ///Summary 
    /// About Ready Enum Value 
    ///Summary 
    Ready 
}; 

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

Поскольку ваше перечисление связано с включением/выключением, вы можете использовать его в логическом режиме. 0 означает False или off и 1 - true или on.

Вы также можете конвертировать ваши перечисления в целое, как

int value = (int)State.On; // value will have 1 

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

State st = (State)int.Parse(mydatabasevalue); 
1

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

Смежные вопросы