2011-05-13 11 views
10

मेरे पास कोड का एक सेट है जो एप्लिकेशन के लिए विशेष है (कोड के नाम पर एक से एक मैपिंग), और मैं उनका प्रतिनिधित्व करने के लिए सी # में enums का उपयोग कर रहा हूं। मुझे यकीन नहीं है कि अगर यह भी जरूरी है। मूल्यों कभी नहीं बदल, और वे हमेशा उन लेबल के साथ जुड़े होने के लिए जा रहे:स्थिर सदस्यों के साथ एनम बनाम कॉन्स्टेंट/कक्षा?

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

मैं एक enum या स्थिर सदस्यों के साथ एक वर्ग उपयोग करना चाहिए?

उत्तर

11

टाइप int के स्टेटिक सदस्य मेरे लिए एक enum से कम लगते हैं। आप एक enum की टाइपफैटी खो देते हैं। और जब आपको डीबगिंग करते हैं तो आपको प्रतीकात्मक नाम दिखाई नहीं देता है बल्कि केवल एक संख्या होती है।

दूसरी तरफ यदि किसी प्रविष्टि में केवल एक नाम/अभिन्न अंग जोड़ी से अधिक होता है तो एक वर्ग एक अच्छा विचार हो सकता है। लेकिन फिर खेतों में उस वर्ग का होना चाहिए और int नहीं होना चाहिए। कुछ की तरह:

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

+1; enums का उपयोग किए बिना आप 'Enum.GetValues' और' Enum.GetNames 'के माध्यम से मूल्यों को प्रोग्रामिक रूप से * गणना * करने की क्षमता खो देते हैं। यह अक्सर उपयोगी हो सकता है कॉम्बो बॉक्स भरने पर, आदि –

+1

आपकी कक्षा में इन गणना सुविधाओं को जोड़ना प्रतिबिंब गणना स्थिर क्षेत्रों पर आधारित नहीं है। – CodesInChaos

+1

बेशक यह कठिन नहीं है। बिंदु एक enum के साथ है, आप भी * उन्हें जोड़ने के लिए। (यह भी कम सुरक्षित है क्योंकि आप नामकरण सम्मेलन के आधार पर व्यक्तिगत मूल्यों को मानते हैं, संभवतः –

1

चेक बाहर State Pattern इस रूप में एक बेहतर डिजाइन है। आपके द्वारा उपयोग किए जाने वाले विचार के साथ आप एक बड़े स्विच/अगर-अन्य कथन के साथ समाप्त हो जाएंगे जो इसे जारी रखना बहुत मुश्किल हो सकता है।

2

एक enum का उपयोग करें। भले ही आपके कोड कभी नहीं बदले, यह जानना मुश्किल होगा कि मूल्य केवल निरीक्षण द्वारा दर्शाता है। Enums का उपयोग करने की कई ताकत में से एक।

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 

यहां तक ​​कि डीबगर भी आपको बहुत मदद नहीं करेगा, खासकर अगर कई अलग-अलग मूल्य हैं।

+0

आप आईडी/मान/विवरण गुणों के साथ अपने स्वयं के प्रकार का उपयोग कर सकते हैं inste यूंट का विज्ञापन इसके अलावा आप ToString() को ओवरराइड कर सकते हैं या सिस्टम का उपयोग भी कर सकते हैं। डायग्नोस्टिक्स। डिबगर डिस्प्ले को वैयक्तिकृत करने के लिए कि प्रकार कैसे प्रदर्शित किया जाएगा। – JoanComasFdz

0

मैं अधिक जानकारी प्रदान करता हूं क्योंकि वे अधिक जानकारी प्रदान करते हैं और वे आपके कोड को "सही तरीके से उपयोग करना और गलत तरीके से उपयोग करना मुश्किल" बनाते हैं। (मुझे लगता है कि उद्धरण व्यावहारिक प्रोग्रामर से है।

संबंधित मुद्दे