2017-12-13 50 views
6

मैं आश्चर्यचकित था, लेकिन सी # में कन्स्ट्रक्टर के साथ enums बनाया जा सकता है।एनम कन्स्ट्रक्टर को कैसे रोकें

public enum Color 
{ 
    White = 1, 
    Red = 2 
} 

तो यह इस तरह बनाया जा सकता है:: उदाहरण के लिए, मैं enum है

var color = new Color(); 

और मान 0 है, जो वास्तव में मान्य enum मान नहीं है हो जाएगा।

तो, क्या हम किसी भी तरह से enum रचनाकारों को प्रतिबंधित कर सकते हैं? कोई अन्य विचार इस से कैसे बचें?

धन्यवाद।

+3

'var color = (रंग) 125; 'पूरी तरह से कानूनी भी है। आपको मैन्युअल रूप से जांचना होगा कि enum चर पढ़ने के दौरान मान वैध है या नहीं ... – Haukinger

+1

https://msdn.microsoft.com/en-us/library/ms182149.aspx देखें, आपको गैर- ध्वज enum? – PaulF

+0

0 किसी भी मान प्रकार के लिए डिफ़ॉल्ट है चाहे वह मान्य है या नहीं और बदला नहीं जा सकता है। आप enum का उपयोग कर क्या कर रहे हैं? शायद अगर हमारे पास अधिक संदर्भ था तो हम एक विकल्प का सुझाव दे सकते थे। – Equalsk

उत्तर

9

तो, क्या हम किसी भी तरह से enum रचनाकारों को प्रतिबंधित कर सकते हैं?

सं समस्या सख्ती से निर्माता से संबंधित न होकर जाता है: (Color)0 भी मान्य है, के बाद से अंतर्निहित प्रकार मान 0 हो सकता है।

कोई अन्य विचार इस से कैसे बचें?

नहीं, यह मूल रूप से एक व्यापक समस्या है। इसे रोकने का एकमात्र तरीका वैधता पर आपके इनपुट मानों की जांच करना है।

Code Analysis के अनुसार आपके पास हमेशा 0 enum मान होना चाहिए।

+1

आपको इसे enum को असाइन करने के लिए '0' डालने की भी आवश्यकता नहीं है। –

+0

@ मैथ्यू वाटसन सहमत हैं, लेकिन अन्यथा कोड नमूना समझना मुश्किल होगा। –

1

कोई सामान्य रूप से इससे बचने का कोई तरीका नहीं है। आपके पास एक स्थिर विश्लेषक चेतावनी दे सकता है, लेकिन यह अंतर्निहित समस्या को हल नहीं करता है कि एक enum केवल एक संख्या है और इस तरह के मूल्य 123 हो सकता है। अधिकतर इसमें मूल्य शून्य होगा (उदाहरण के लिए यदि आप इसे नया करते हैं, या इसे असाइन न करें)।

अधिक स्पष्ट रूप से समस्या को देखने के लिए, इस पर विचार करें:

var colors = new Color[100]; 

क्या colors[0] अब है? यह शून्य है, किसी भी प्रारंभिक संख्या की तरह। तो एक enum आपको मूल्यों के नाम देने की अनुमति देता है - यह गारंटी देता है कि प्रकार के चर उन नामित मूल्यों में से एक का उपयोग करता है।

एक अच्छा सर्वोत्तम अभ्यास हमेशा आपके enum में शून्य के लिए नाम मान रखना है (आमतौर पर इस मामले में इसे "कोई नहीं", "अनियंत्रित", "नोटसेट" या इसी तरह कहा जाएगा। एक बार आपके पास हो जाने के बाद, अनियमित मूल्यों का अर्थ होगा।

1

public enum Color वास्तव में एक enum की पूर्ण घोषणा का संक्षिप्त रूप है, जो public enum Color : int होगा।

एक enum हमेशा में अंतर्निहित आधार प्रकार है, और तकनीकी रूप से बस उस प्रकार का एक चर है। डिफ़ॉल्ट रूप से, यह प्रकार 32-बिट पूर्णांक है, जिसका अर्थ है कि किसी भी 32-बिट पूर्णांक को इस तरह के enum को असाइन किया जा सकता है।

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

लेकिन आंतरिक रूप से, अपने प्रकार Color के सभी enums (भयानक नाम, वैसे) बस Int32 मान रहे हैं, और as Anders Forsgren pointed out, किसी भी अन्य Int32 मूल्य की तरह, वे 0 सरणियों में वैश्विक चर के किसी भी प्रकार लागू हो और होगा। यही कारण है कि आधिकारिक दिशानिर्देश हमेशा आपके enum में 0 परिभाषा डालने की सलाह देते हैं।

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