2008-12-06 7 views
8

अगर एनम्स में अनियमित मूल्य होना चाहिए तो हमें बहस हो रही थी। उदाहरण के लिए। हमक्या एनम्स में अनियमित मूल्य होना चाहिए।

public enum TimeOfDayType 
{ 
    Morning 
    Afternoon 
    Evening 
} 

या

public enum TimeOfDayType 
{ 
    None 
    Morning 
    Afternoon 
    Evening 
} 

मुझे लगता है कि वहाँ किसी भी कोई भी नहीं होना चाहिए, लेकिन फिर आप प्रारंभ पर कुछ मान्य मान के लिए डिफ़ॉल्ट करने के लिए है है। लेकिन दूसरों ने सोचा कि एक और enum है जो कोई नहीं या नोटसेट है, द्वारा uniitized राज्य का कुछ संकेत होना चाहिए।

विचार?

उत्तर

13

निरर्थक प्रकारों का बोलना - मुझे लगता है कि उन्हें एक enum के प्रारंभिकरण को मजबूर करने/मजबूर करने की समस्या को हल करने के लिए उपयोग किया जा सकता है।

void Draw(Color c); 

कि समारोह का कहना है कि यह एक वैध Color की आवश्यकता है: हम

enum Color { Red, Blue } 

है और मान लीजिए कि आप एक समारोह है चलो का कहना है।

void Draw(Color? c); 

का कहना है कि काम नहीं संभाल कर सकते हैं एक रंग (null इंगित करने के लिए "परवाह नहीं है" पारित कर दिया जाएगा) पारित किया जा रहा: हालांकि, हम भी इस समारोह हो सकता था।

अच्छा, यह None सदस्यों के लिए एक विकल्प है।

+0

सहमत हैं, सबसे साफ समाधान एक शून्य प्रकार है। यह अच्छी तरह से डीबी स्कीमा के लिए भी नक्शे। –

+9

यह दुर्भाग्यपूर्ण है कि .NET में enums आपको मान्य मान में पास करने के लिए मजबूर नहीं करता है। मैं (रंग) 123123 में पास कर सकता हूं जो संकलित और ठीक से चलाएगा - ड्रा विधि को सत्यापन करना होगा :( –

+2

शायद सी से विरासत, जहां संकलक को पता नहीं है कि एक enum का उपयोग एक वास्तविक गणना के रूप में किया जाता है या नहीं टाइप करें, या झंडे के सेट के रूप में। तो यह हवा और सरेंडर में अपने हाथ फेंकता है। –

1

निर्भर करता है कि प्रकार का उपयोग कैसे किया जाता है। इस प्रकार के उपयोगकर्ताओं के लिए अक्सर "अनिर्धारित" मान नहीं होना आसान होता है, क्योंकि आपके पास विशेष-मामले एक मान नहीं है। लेकिन अगर आपको एक की आवश्यकता है (क्योंकि मूल्यों को कभी-कभी ऐसे राज्य में होना जरूरी है जो अन्यथा कोई भी मूल्यवान मान नहीं है) तो आपको एक की आवश्यकता है। आप आमतौर पर एक के बजाय दो enums का उपयोग कर किसी भी विशेष मामले कोड को बचा नहीं है।

यह पूछने की तरह थोड़ा सा है कि आपको शून्य प्रकारों का उपयोग करना चाहिए या नहीं।

3

बस फ्रैंक उत्तर में जोड़ना, एकमात्र बार मैं एक 'एनम' आइटम को नलिका में चुनने का विकल्प चुनता हूं, जब enum का उपयोग झंडे के रूप में किया जा रहा है। 'कोई नहीं' आइटम 0 की आईडी होगी।

4

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

वैसे भी, मुझे लगता है कि "कोई नहीं" का डिफ़ॉल्ट मान है या enum nullable बनाने से केवल तभी अर्थ होता है जब enum को किसी वर्ग के लिए डिफ़ॉल्ट कन्स्ट्रक्टर में तर्क के रूप में उपयोग किया जाता है। और आपको खुद से पूछना है - क्या उस वर्ग की वस्तुओं को कुछ अर्थपूर्ण डिफ़ॉल्ट मान नहीं होना चाहिए? TimeOfDayType enum के साथ अपने उदाहरण का उपयोग करना - यदि आप TimeOfDayType.None के साथ किसी ऑब्जेक्ट को प्रारंभ करते हैं, तो आप मॉर्निंग, दोपहर या शाम को मान बदलने से पहले इसका उपयोग नहीं कर सकते हैं। तो क्या आप यह नहीं कह सकते कि डिफ़ॉल्ट किसी के बजाय सुबह नहीं है? या - जो भी बेहतर है - क्या आप पहले से ही जानते हैं कि उन्हें कौन सी enum value की आवश्यकता है, आप अपनी ऑब्जेक्ट्स नहीं बना सकते? मुझे लगता है कि अगर शुरुआती डिज़ाइन चरणों में समस्या का सही ढंग से सामना किया जाता है, तो आपको अपने enums के लिए एक विशेष डिफ़ॉल्ट मान की आवश्यकता नहीं है।

बेशक, उपरोक्त सभी एक सामान्यीकरण है।हो सकता है कि इसे आपके विशेष परिदृश्य पर लागू नहीं किया जा सके, इसलिए यदि आप इसके बारे में कुछ विवरण देते हैं, तो हम इस मुद्दे पर और अधिक अच्छी तरह से चर्चा कर सकते हैं।

+0

यह मूल कारण का एक अच्छा विश्लेषण है। हमेशा पहले एक कदम उठाएं। –

4

एक "डिफ़ॉल्ट" के सदस्य की abscence में, मुझे लगता है कि यह वाला मान के लिए मूल्यवान है शाब्दिक पूर्णांक 0.

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

मेरे लिए यह शैली का एक मुद्दा है: यदि enum स्पष्ट रूप से किसी मान के लिए प्रारंभ नहीं किया गया है, तो इसे एक मनमाना वैध मान या स्पष्ट प्रारंभिक कमी की कमी का संकेत देने वाला विशिष्ट मान दिया जाना चाहिए?

enum Color { Unknown, Red, Blue } 
enum Color2 { Red,Blue } 
struct Example<T> { 
    Color color; 
} 

static void SomeMethod() { 
    var v1 = new Example<Color>(); 
    var v2 = new Example<Color2>(); 
} 

v1 के मामले में, यदि रंग क्षेत्र का निरीक्षण किया जाता है तो इसे स्पष्ट रूप से एक प्रारंभिक क्षेत्र के रूप में लेबल किया जाएगा। V2 में फ़ील्ड सरल "लाल" होगा। प्रोग्रामर के लिए "रेड" या "लाल" के लिए एक निहित डिफ़ॉल्ट मान के बीच पहचानने और स्पष्ट रूप से सेट करने का कोई तरीका नहीं है।

एक और मामला जहां यह समस्या का कारण बनता है, एक एनम मूल्य के खिलाफ स्विच स्टेटमेंट कर रहा है। आइए रंग 2 की परिभाषा को धीरे-धीरे बदल दें।

enum Color2 { Red = 1, Blue = 2 } 
static void SomeOtherMethod(p1 as Example<Color2>) { 
    switch (p1.color) { 
    case Color.Red: {} 
    case Color.Blue: {} 
    default: {throw new Exception("What happened?"); } 
    } 
} 

स्विच एनम में हर स्पष्ट मूल्य को संभालता है। फिर भी यह कोड उदाहरण < रंग 2 > के डिफ़ॉल्ट निर्माता के लिए विफल हो जाएगा और इस कन्स्ट्रक्टर को दबाए रखने का कोई तरीका नहीं है।

इस लाता है एक slighly अधिक महत्वपूर्ण नियम: वस्तुतः मान 0.

+1

मुझे यकीन नहीं है कि आपको स्पष्ट क्यों होना चाहिए 0 के लिए enum मान। बस इसे छोड़ दें, और स्पष्ट रूप से अन्य मानों को प्रारंभ करें - इसलिए लाल = 1, ब्लू = 2, उदाहरण के लिए, अधिकांश भाग के लिए समान प्रभाव, लेकिन फिर Enum.GetValues ​​आदि में "अज्ञात शामिल नहीं होगा "मान –

+0

मैं एक स्पष्ट मान जोड़ता हूं क्योंकि यह अपेक्षाओं को उचित रूप से सेट करता है। उस enum के 0 मूल्यवान उदाहरण हो सकते हैं और यह एक मूल्य प्रकार के सदस्य के रूप में इसका उपयोग करने का एक गैर-टालने योग्य परिणाम है। मुझे लगता है कि यह बनाता है कोड स्पष्ट रूप से डीए के लिए स्पष्ट है अज्ञात अपफ्रंट के साथ एल। – JaredPar

+0

0 मान एक स्पष्ट मान के बिना 0 के रूप में दिखाई देंगे, और इसका मतलब है कि आपको "वास्तविक" मानों की सूची देखते समय इसे स्पष्ट रूप से हटाने की आवश्यकता नहीं है। मुझे लगता है कि यह सही उपयोग पर निर्भर करता है। –

7

मैं हमेशा शून्य करने के लिए मेरी enum शाब्दिक में से एक सेट के लिए एक स्पष्ट enum मूल्य है। इस शाब्दिक को हमेशा "कोई नहीं" या "नोटसेट" नाम नहीं दिया जाना चाहिए। यह निर्भर करता है कि क्या एक शाब्दिक है जो डिफ़ॉल्ट रूप से बहुत अच्छी तरह से कार्य करता है।

मैं एक को शून्य पर सेट करता हूं क्योंकि, एनम्स (शून्य रहित enums को छोड़कर) हमेशा सीएलआर द्वारा स्मृति में शून्य में प्रारंभ किया जाता है। और यदि आप किसी एक शब्दकोष को परिभाषित नहीं करते हैं तो इस मेमोरी में अवैध मान हैं। इसके अलावा जब आप झंडे के रूप में enums का उपयोग करें। डिफ़ॉल्ट मान का उपयोग bitwise compairisons करने के लिए नहीं किया जा सकता है। नतीजा हमेशा शून्य होगा।

जब आप FxCop को सक्षम करते हैं तो यह जांचता है कि आपने डिफ़ॉल्ट रूप से एक शाब्दिक परिभाषित किया है या नहीं। ऐसा लगता है कि उनके पास नियम होने पर "अच्छा अभ्यास" होना प्रतीत होता है।