Enum vs Constants/Class со статическими членами?
У меня есть набор кодов, которые относятся к приложению (одно к одному сопоставление кода с его именем), и я использовал перечисления в С# для их представления. Я не уверен сейчас, если это даже необходимо. Значения никогда не меняются, и они всегда будут связаны с этими метками:
Workflow_Status_Complete = 1
Workflow_Status_Stalled = 2
Workflow_Status_Progress = 3
Workflow_Status_Complete = 4
Workflow_Status_Fail = 5
Должен ли я использовать перечисление или класс со статическими членами?
Ответы
Ответ 1
Статические члены типа int, по-видимому, уступают мне перечислению. Вы теряете типы перечислений. А при отладке вы не видите символического имени, а просто цифры.
С другой стороны, если запись состоит из пары, отличной от пары name/integervalue, класс может быть хорошей идеей. Но тогда поля должны быть этого класса, а не int. Что-то вроде:
class MyFakeEnum
{
public static readonly MyFakeEnum Value1=new MyFakeEnum(...);
}
Ответ 2
Используйте перечисление. Даже несмотря на то, что ваши коды никогда не меняются, будет трудно понять, что значение представляет только путем проверки. Одна из многих преимуществ использования перечислений.
enum RealEnum : uint
{
SomeValue = 0xDEADBEEF,
}
static class FakeEnum
{
public const uint SomeValue = 0xDEADBEEF;
}
var x = RealEnum.SomeValue;
var y = FakeEnum.SomeValue;
// what the value?
var xstr = x.ToString(); // SomeValue
var ystr = y.ToString(); // 3735928559
Даже отладчик вам не поможет, особенно если есть много разных значений.
Ответ 3
Просмотрите шаблон состояния, поскольку это лучший дизайн. С идеей, которую вы используете, вы получите большой оператор switch/if-else, который может быть очень трудно поддерживать.
Ответ 4
Я бы склонялся к перечислениям, поскольку они предоставляют больше информации, и они делают ваши коды "более удобными для использования правильно и трудно использовать неправильно". (Я думаю, цитата из "Прагматического программиста".