2012-05-15 15 views
6

मेरे पास मूल्यों का एक समूह है जो एक राज्य (चालू, बंद, तैयार, ...) का प्रतिनिधित्व करता है। इन मानों को एक डीबी में एक int फ़ील्ड के रूप में भी संग्रहीत किया जाता है, इसलिए मैं सोच रहा हूं कि सर्वोत्तम प्रथाओं को कक्षा में कॉन्स इंटेल प्रकारों का एक enum या सिर्फ गुच्छा बनाने के लिए कहा जाएगा।सी # एनम या इंट स्थिरांक

एनम मानव पढ़ने/कोडिंग के लिए एक प्राकृतिक फिट की तरह प्रतीत होता है, लेकिन ऐसा लगता है कि यह इस तथ्य को छुपाता है कि यह महत्वपूर्ण है कि मूल्यों को मानचित्र को पूर्णांक करता है (या फिर डीबी से पुनर्प्राप्त मूल्य गलत स्थिति में तत्काल हो जाएंगे)। कोई भी बाद में आ सकता है और enum या कुछ के लिए एक नया मूल्य जोड़ सकता है और पूरी चीज को फेंक देता है।

बेहतर तरीका कौन सा है?

+1

यह पूर्णांक के लिए भी सच है! आप प्रत्येक enum के लिए इच्छित मान सेट कर सकते हैं और संकलक आपके कोड को लागू करेगा (थोड़ा सा)। कम से कम आप लिखने में सक्षम नहीं होंगे: myVar.MyEnum = 12345; –

+1

मैं आपके उदाहरण के लिए 'enum' जाना होगा। पीआई स्थिर है, जैसा कि प्रकाश की गति है। राज्यों का आपका सेट मेरी विनम्र राय में नहीं है। – Ste

उत्तर

10

मुझे लगता है कि enum अभी भी पठनीयता के लिए सबसे अच्छा विकल्प है। हालांकि, बाद से अपने मूल्यों को डीबी में संग्रहीत होते हैं, तो आप मान स्पष्ट रूप से निर्दिष्ट करना चाहिए:

enum State { On = 1, Off = 2, Ready = 3}; 
+0

+1 @OxedFrederik बस ** ** एक enum घोषित नहीं है लेकिन आपके मॉडल में ** जांच ** यह मान्य है। आप एक enum के लिए कोई पूर्णांक डाली जा सकते हैं। व्यक्तिगत रूप से मैं केविन द्वारा पोस्ट किए गए समाधान से प्यार करता था। –

0

आप अपने आप को भी Enum में मूल्यों का निर्धारण कर सकते हैं, यानी:

enum STATE {ON=2, OFF=9, READY=14}; 
3

कैसे किसी को एक नया enum जोड़ रहा है एक नई निरंतर int से अलग मूल्य?

याद रखें, आप एक विशिष्ट पूर्णांक मान में एक enum सेट कर सकते हैं।

पठनीयता को गले लगाओ!

एक अतिरिक्त बोनस के रूप में, आप अब मजबूत टाइपिंग की तरह

Widget.state = 474; 

धोखाधड़ी को रोकने के लिए उपयोग करते हैं कहाँ 474 अपने डेटाबेस में एक राज्य के अनुरूप नहीं है सकते हैं।

+0

यह सच है, लेकिन इस प्रकार की चीज़ के लिए सबसे अस्थिर क्षेत्र एप्लिकेशन सीमाओं पर है जहां क्रमबद्धता होती है। इसका मतलब है कि आप 'widget.state = (StateEnum) stateId' जैसे विवरणों के साथ समाप्त होते हैं और सी # ** ** ** ** देखभाल नहीं करते हैं, यदि 'राज्य आईडी' 'राज्य 'नाम में मान्य मान है और ** ** ** अपवाद फेंक नहीं देगा 'राज्य आईडी '474 है। – Nick

+0

@ निक हाँ, अपने इनपुट को स्वच्छ करें। [ऐसा करने में सहायता करने के लिए यहां तक ​​कि enum विधियां भी हैं।] (Https://msdn.microsoft.com/en-us/library/system.enum.isdefined.aspx) – MushinNoShin

1

मैं एक enum के साथ जाने के लिए और यकीन है कि यह बहुत अच्छी तरह से प्रलेखित है जो तालिका enum से मेल खाती है होगा।

स्थिरांक ints के एक समूह के साथ खतरा यह है कि प्रकार क्या मान्य मान रहे हैं का कोई संकेत नहीं बता देते हैं और किसी को बहुत आसानी से किसी भी पुराने मूल्य निर्दिष्ट कर सकता है। अपने कोड का एक दुर्भावनापूर्ण उपयोगकर्ता अभी भी एक कलाकारों के साथ ऐसा कर सकता है, लेकिन आप खुद को अपने स्वयं के पैर में शूटिंग से कुछ लोगों को नहीं रोक सकता ...

0

मैं Enums कहेंगे। वे आपको एक मानवीय पठनीय प्रारूप में मशीन प्रारूप का विकल्प देते हैं। सुनिश्चित करें कि आप इसे बहुत अच्छी तरह से दस्तावेज करते हैं

///Summary 
/// About State Enum 
///Summary 
enum State : int 
{ 
    ///Summary 
    /// About Off Enum Value 
    ///Summary 
    Off = 0, 
    ///Summary 
    /// About On Enum Value 
    ///Summary 
    On, 
    ///Summary 
    /// About Ready Enum Value 
    ///Summary 
    Ready 
}; 

प्रत्येक सदस्य को मूल्य आवंटित करने की आवश्यकता नहीं है। 0 से शुरू करें और बाकी स्वचालित रूप से बढ़ेगा।

के बाद से अपने enum के बारे में/बंद है, तो आप बूलियन तरह से इसका इस्तेमाल कर सकते हैं। 0 झूठी या बंद और 1 सच या पर खड़ा है।

तुम भी तरह पूर्णांक के रूप में डेटाबेस में

int value = (int)State.On; // value will have 1 

सहेजें मूल्य int करने के लिए अपने enum बदल सकते हैं। और पुन: प्राप्त करने आप इस

State st = (State)int.Parse(mydatabasevalue); 
1

की तरह कर सकते हैं अपने मूल्यों शायद ही कभी बदल जाएगा, या आप संपादन और अपने कोड recompiling के साथ कोई समस्या नहीं है, तो सुनिश्चित करें कि प्रत्येक के लिए पूर्णांक मूल्यों की स्पष्ट घोषणा के साथ एक enum का उपयोग करते हुए ।अन्यथा, मैं एक ऑब्जेक्ट रैपर बनाउंगा जो डेटाबेस से मान खींचता है (यदि आप प्रदर्शन के बारे में चिंतित हैं तो आप हमेशा मानों को कैश कर सकते हैं)। फिर उस ऑब्जेक्ट रैपर के साथ अपनी सभी तुलना करें। जब तक कि आप डेटाबेस में मानों को बीमा नहीं कर सकते हैं, आपके कोड में एनम का उपयोग करके अपडेट किए जा रहे कोड को बिना अस्थिर और जोखिम भरा है। यदि आप वास्तव में साहसी हैं और कोड उत्सर्जित करना चाहते हैं तो आप इसके साथ कुछ सुंदर चीजें कर सकते हैं।

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