2011-05-13 26 views
10

Uygulamaya özel bir kod kümem var (kodun adına birebir eşleme) ve bunları temsil etmek için C# içinde enumları kullanıyorum. Şimdi gerekli olsa bile emin değilim. değerleri asla değiştirmek ve her zaman bu etiketlerle ilişkili olacak:Enum vs Sabitler/Statik Üyeli Sınıf?

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

Bir enum veya statik üyeleri ile bir sınıf kullanmalı mıyım?

cevap

11

Type int statik üyeleri bana bir numaradan daha az gibi görünüyor. Bir enumun türünü kaybedersiniz. Ve hata ayıklama yaparken sembolik ismi göremezsiniz, ancak sadece bir sayı.

Diğer taraftan, bir giriş sadece bir ad/integervalue çifti dışındaysa, bir sınıf iyi bir fikir olabilir. Ama sonra alanlar bu sınıftan olmalı ve int değil. şöyle birşey:

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

+1; enumlar kullanmadan, * Enum.GetValues ​​ve Enum.GetNames' yoluyla değerleri * programlayarak * sıralayabilirsiniz. Bir açılan kutu, vb doldururken –

+1

Bu numaralandırma özellikleri eklemek, yansıma numaralandırma statik alanlarına dayanarak zor değil.Telifte – CodesInChaos

+1

zor değil.Kendi bir enum ile, hatta * sahip * Bunları eklemek için. (Ayrıca, adlandırma kurallarına dayanarak bireysel değerleri kabul ettiğinizden de daha az güvenlidir) –

1

Kontrol dışarı bu kadar State Pattern daha iyi bir tasarımdır. Kullandığınız fikir ile devam etmek için çok zor olabilen büyük bir switch/if-else deyimiyle sonuçlanacaksınız.

2

Bir numara kullanın. Kodlarınız asla değişmese de, değerin yalnızca denetim ile neyi temsil ettiğini bilmek zor olacaktır. Enumları kullanmanın birçok güçlü yönlerinden biri.

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 

Özellikle birçok farklı değer varsa, hata ayıklayıcınız bile burada pek yardımcı olmaz.

+0

Kimlik/değer/açıklama özellikleri ile kendi türünü kullanabilirsiniz. uint reklamı. Ayrıca, türün nasıl görüntüleneceğini kişiselleştirmek için ToString() öğesini geçersiz kılabilir veya System.Diagnostics.DebuggerDisplay öğesini kullanabilirsiniz. – JoanComasFdz

0

Daha fazla bilgi sağladığından ve kodlarınızı "daha doğru ve kullanımı zor bir şekilde kullanmak için daha kolay" hale getirdiklerinden enumlara doğru eğilirim. (Bence teklif, The Urbanmatic Programmer'dan geliyor.