Enums निश्चित रूप से कोड को अधिक पठनीय बना सकते हैं। (.Net कम से कम) के लिए बाहर देखने के लिए अभी भी कुछ चीजें हैं
क्योंकि एक एनम का अंतर्निहित भंडारण एक इंट है, डिफ़ॉल्ट मान शून्य होगा, इसलिए आपको यह सुनिश्चित करना चाहिए कि 0 एक समझदार डिफ़ॉल्ट है। (जैसे संरचना में बनाए जाने पर सभी फ़ील्ड शून्य पर सेट हो जाते हैं, इसलिए 0. के अलावा डिफ़ॉल्ट को निर्दिष्ट करने का कोई तरीका नहीं है। यदि आपके पास 0 मान नहीं है, तो आप इंटम को कास्टिंग किए बिना इंट का परीक्षण भी नहीं कर सकते हैं, जो कि होगा खराब शैली।)
यदि आपके एनम आपके कोड के लिए निजी हैं (कभी सार्वजनिक रूप से उजागर नहीं किए जाते हैं) तो आप यहां पढ़ना बंद कर सकते हैं।
यदि आपके एनमों को किसी भी तरह से बाहरी कोड में प्रकाशित किया जाता है और / या प्रोग्राम के बाहर सहेजे जाते हैं, तो उन्हें स्पष्ट रूप से क्रमांकित करने पर विचार करें। कंपाइलर स्वचालित रूप से उन्हें 0 से नंबर देता है, लेकिन यदि आप अपने एनम को बिना मूल्यों के देते हैं, तो आप दोषों को समाप्त कर सकते हैं।
मैं कानूनी तौर पर लिख सकता हूं
WriteMode illegalButWorks = (WriteMode)1000000;
file.Write( data, illegalButWorks );
इसका मुकाबला करने के लिए, कोई भी कोड जो एक एनम का उपभोग करता है जिसे आप निश्चित नहीं कर सकते हैं (जैसे सार्वजनिक एपीआई) यह जांचने की आवश्यकता है कि एनम वैध है या नहीं। आप इसके माध्यम से करते हैं
if (!Enum.IsDefined(typeof(WriteMode), userValue))
throw new ArgumentException("userValue");
इसका केवल Enum.IsDefined
यह है कि यह प्रतिबिंब का उपयोग करता है और धीमा है। यह भी एक संस्करण समस्या ग्रस्त है। यदि आपको अक्सर एनम मान की जांच करने की आवश्यकता है, तो आप निम्नलिखित से बेहतर होंगे:
public static bool CheckWriteModeEnumValue(WriteMode writeMode)
{
switch( writeMode )
{
case WriteMode.Append:
case WriteMode.OverWrite:
break;
default:
Debug.Assert(false, "The WriteMode '" + writeMode + "' is not valid.");
return false;
}
return true;
}
वर्जनिंग समस्या यह है कि पुराना कोड केवल यह जान सकता है कि आपके पास मौजूद 2 एनम को कैसे हैंडल करना है। यदि आप एक तीसरा मान जोड़ते हैं, तो Enum.IsDefined सत्य होगा, लेकिन पुराना कोड आवश्यक रूप से इसे संभाल नहीं सकता है। ओह।
और भी मज़ेदार है जो आप [Flags]
enums के साथ कर सकते हैं , और इसके लिए सत्यापन कोड थोड़ा अलग है।
मैं यह भी ध्यान रखें चल जाएगा कि पोर्टेबिलिटी के लिए, आप कॉल का उपयोग करना चाहिए ToString()
enum पर, और उपयोग Enum.Parse()
करते समय उन्हें वापस पढ़ने। दोनों ToString()
और Enum.Parse()
संभाल कर सकते हैं [Flags]
enum के रूप में अच्छी तरह से है, इसलिए उन्हें इस्तेमाल करने के लिए नहीं कोई कारण नहीं है। ध्यान रखें, यह अभी तक एक और नुकसान है, क्योंकि अब आप संभवतः कोड तोड़ने के बिना एनम का नाम भी नहीं बदल सकते हैं।
तो, कभी-कभी आपको उपरोक्त सभी को तौलना पड़ता है जब आप खुद से पूछते हैं कि क्या मैं सिर्फ एक बूल के साथ दूर हो सकता हूं?