2011-05-13 14 views
10

Mam zestaw kodów, które są specyficzne dla aplikacji (od jednego do jednego odwzorowania kodu na jego nazwę), a ja używam wyrażeń w języku C# do ich reprezentowania. Nie jestem pewien, czy to nawet konieczne. Wartości nigdy się nie zmieniają i są zawsze będzie związane z tymi etykietami:Enum vs Constants/Class with Static Members?

Workflow_Status_Complete = 1 
Workflow_Status_Stalled = 2 
Workflow_Status_Progress = 3 
Workflow_Status_Complete = 4 
Workflow_Status_Fail = 5 

Należy użyć enum lub klasy z członków statycznych?

Odpowiedz

11

Statyczne elementy typu int wydają się być gorsze od wyliczenia dla mnie. Tracisz typafety wyliczenia. A podczas debugowania nie widzisz nazwy symbolicznej, ale tylko liczbę.

Z drugiej strony, jeśli pozycja składa się z pary więcej niż nazwa/liczba całkowita, klasa może być dobrym pomysłem. Ale wtedy pola powinny należeć do tej klasy, a nie do int. Coś jak:

class MyFakeEnum 
{ 
    public static readonly MyFakeEnum Value1=new MyFakeEnum(...); 
} 
+3

+1, bez użycia wyliczeń tracisz także możliwość programowego * wyliczania * wartości poprzez 'Enum.GetValues' oraz' Enum.GetNames' .To może często być użyteczne przy wypełnianiu pola kombi itp. –

+1

Dodanie tych funkcji wyliczania do klasy nie jest trudne w oparciu o wyliczanie pól statycznych zliczania – CodesInChaos

+1

oczywiście nie jest to trudne.To jest z wyliczeniem, nawet nie masz * aby je dodać (jest także mniej bezpieczny, ponieważ przypuszczalnie przyjmowałbyś indywidualne wartości na podstawie konwencji nazewnictwa), prawdopodobnie). –

1

Sprawdź, czy jest to lepszy projekt niż State Pattern. Z pomysłem, którego używasz, otrzymasz dużą instrukcję switch/if-else, która może być bardzo trudna do utrzymania.

2

Użyj wyliczenia. Mimo że twoje kody nigdy się nie zmieniają, trudno będzie ustalić, jaka wartość reprezentuje tylko przez inspekcję. Jedna z wielu zalet używania wyrażeń.

enum RealEnum : uint 
{ 
    SomeValue = 0xDEADBEEF, 
} 
static class FakeEnum 
{ 
    public const uint SomeValue = 0xDEADBEEF; 
} 

var x = RealEnum.SomeValue; 
var y = FakeEnum.SomeValue; 
// what's the value? 
var xstr = x.ToString(); // SomeValue 
var ystr = y.ToString(); // 3735928559 

Nawet debugger nie pomoże ci tutaj, szczególnie jeśli istnieje wiele różnych wartości.

+0

Możesz użyć własnego typu z instancją właściwości id/value/description reklama z uint. Możesz także przesłonić ToString() lub nawet użyć System.Diagnostics.DebuggerDisplay, aby spersonalizować sposób wyświetlania typu. – JoanComasFdz

0

Chciałbym pochylić się do wyliczeń, ponieważ zapewniają one więcej informacji i sprawiają, że kody są "łatwiejsze w użyciu i niewłaściwe w użyciu". (Myślę, że cytat pochodzi z Pragmatycznego programisty