2012-10-03 13 views
13

एक डीएलएल में इस enum कल्पना कीजिए।क्या एनम वैल्यू जोड़ना बाइनरी संगतता को तोड़ता है?

public enum Colors 
{ 
    Red, 
    Green 
} 

क्या एनम मूल्य जोड़ना बाइनरी संगतता को तोड़ता है? अगर मैं इसे बदलना चाहता था, तो क्या मौजूदा EXE टूट जाएगा?

public enum Colors 
{ 
    Red, 
    Green, 
    Blue 
} 

मैं this answer देखा था, लेकिन यह एक मूल्य डालने के मामले को संबोधित करने लग रहा था। यदि मैं पर मान जोड़ता हूं तो केवल, क्या यह ठीक है?

उत्तर

17

नहीं, यह द्विआधारी संगतता को तोड़ता नहीं है (जितना अधिक: असेंबली अभी भी लोड होगा), क्योंकि enums मूल रूप से पूर्णांक शाब्दिक स्थिरांक हैं। बीच में मूल्य डालना स्पष्ट रूप से वास्तव में एक खतरनाक विचार है, लेकिन आप इसे पहले से ही बाहर कर चुके हैं।

हालांकि, यह अन्य मुद्दों है कि आप से बचने के लिए की जरूरत के एक नंबर पैदा कर सकता है: (विशेष रूप से switch बयान) नए मूल्यों की आशा नहीं कर सकते हैं

  • कुछ कोड; तकनीकी रूप से इस से पहले भी एक मुद्दा था, के बाद से enums मूल्य जाँच (enum चर अपरिभाषित मान हो सकते हैं)
  • कुछ भी है कि उपलब्ध enums प्रश्नों अलग परिणाम
      विशेष रूप से
    • होने वाली है नहीं कर रहे हैं, क्रमबद्धता और अक्रमांकन विफल हो सकता है अप्रत्याशित रूप से अगर वहाँ enums का उपयोग कर डेटा कि अभी तक विशेष ग्राहक
+1

बहुत बढ़िया। टूटने का विरोध करने के लिए मैं क्या कर सकता हूं? जाहिर है, अगर मेरे पास यह तरीका था, तो मैं enums में शामिल नहीं होगा, लेकिन परिस्थितियों को देखते हुए, इस तक पहुंचने का सबसे सुरक्षित तरीका क्या है? स्विच स्टेटमेंट्स (पेंट अनइंटेड) के मामले में, 'डिफ़ॉल्ट:' स्लॉट निर्दिष्ट किया गया है जो इसे परिवर्तनों के खिलाफ सख्त करता है? – TheBuzzSaw

+1

@TheBuzzSaw टूटने का विरोध करने का सबसे अच्छा तरीका यह है कि आप किसी भी चीज के लिए enums का उपयोग न करें जो आप समय के अंत तक एक ही नहीं रहना चाहते हैं। – Servy

+0

@ सर्वी सहमत ... लेकिन चूंकि मैं अभी enums के साथ अटक गया हूँ, आप और क्या मिला? ;) – TheBuzzSaw

3

यह ठीक होना चाहिए द्वारा की उम्मीद नहीं कर रहे हैं, यह सोचते हैं आप केवल अंत करने के लिए संलग्न है। हालांकि, तोड़ने का जोखिम इस तथ्य से आएगा कि enum मानों को 0 से शुरू होने पर स्पष्ट रूप से परिभाषित किया गया है। इसलिए यदि कोई डीबी को मानों को बनाए रखता है, तो आप यह चुनने का जोखिम उठाते हैं कि वे किस मूल्य को मानचित्र बनाते हैं।

उदाहरण के लिए, हो सकता है अगर आप अपने enum बदल रहे हैं:

public enum Colors 
{ 
    Blue, 
    Red, 
    Green 
} 

किसी को भी जो उनके डीबीएस में इन मूल्यों संग्रहीत कि चीजें हैं जो एक बार लाल थे, अब ब्लू हैं देखना होगा, और क्या ग्रीन था अब है लाल।

आदर्श रूप में, तुम इतनी तरह अपने enum परिभाषित करना चाहिए:

public enum Colors 
{ 
    Red = 0, 
    Green = 1 
} 

और तब, जब आप एक नया जोड़ें, आप होना चाहिए:

public enum Colors 
{ 
    Red = 0, 
    Green = 1, 
    Blue = 2 
} 

इससे किसी भी संभावित संस्करण समस्याओं को रोकने के ।

+0

+1। अगर मैं कर सकता तो मैं इसे एक हरा चेक भी दूंगा। Enums को मजबूत बनाने के लिए यह एक शानदार तरीका है। – TheBuzzSaw

+0

ध्यान दें कि चश्मा विशेष रूप से बताते हैं कि, यदि आप कोई मान निर्दिष्ट नहीं करते हैं, तो यह 0 से शुरू होगा और प्रत्येक मान के लिए एक से बढ़ेगा, इसलिए बैकिंग पूर्णांक पहले मामले के लिए अपरिभाषित व्यवहार की तरह नहीं है। आप बस अंत में जोड़ सकते हैं। – Servy

+0

दाएं, लेकिन आपको इसे अंत में जोड़ना होगा या फिर यह टूट जाएगा। –

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