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

Я бы склонялся к перечислениям, поскольку они предоставляют больше информации, и они делают ваши коды "более удобными для использования правильно и трудно использовать неправильно". (Я думаю, цитата из "Прагматического программиста".