2009-11-25 16 views
56

यदि मेरे पास enum सदस्य के साथ कक्षा है और मैं उन स्थितियों का प्रतिनिधित्व करने में सक्षम होना चाहता हूं जहां इस सदस्य को परिभाषित नहीं किया गया है, तो यह बेहतर है?सी # Enums: शून्य या 'अज्ञात' मूल्य?

ए) सदस्य को निरर्थक प्रकारों का उपयोग करके कक्षा में शून्य के रूप में घोषित करें। उदा .:

public SomeEnum? myEnum; 

बी) गणना के लिए एक डिफ़ॉल्ट, 'अज्ञात' मान जोड़ें। उदा .:

public enum SomeEnum { 
    Unknown, 
    SomeValueA, 
    SomeValueB, 
    SomeValueC, 
} 

मैं वास्तव में किसी भी प्रमुख पेशेवर/विपक्ष को किसी भी तरह से नहीं देख सकता; लेकिन शायद एक दूसरे पर बेहतर है?

+0

यह प्रश्न वास्तव में 'विषयपरक' टैग किया जाना चाहिए। –

+23

ठीक है अगर सवाल व्यक्तिपरक लगता है, यह केवल ज्ञान की कमी के लिए नीचे है। यदि ठोस कारण हैं तो किसी को दूसरे पर क्यों इस्तेमाल किया जाना चाहिए तो यह वास्तव में व्यक्तिपरक नहीं है। – UpTheCreek

उत्तर

58

निश्चित रूप से एक शून्य मूल्य प्रकार का उपयोग करें - यही वह है जो वे हैं। यह स्पष्ट रूप से आपके इरादे को बताता है। इसका मतलब यह भी है कि आप Enum.IsDefined (या Unconstrained Melody के समकक्ष यदि आप सामान्य प्रकार की सुरक्षा चाहते हैं) के साथ आसानी से यह निर्धारित करने के लिए उपयोग कर सकते हैं कि कोई विशेष मूल्य वास्तविक मूल्य "नकली" के बारे में चिंता किए बिना भी है।

+3

दिलचस्प। संबंधित: FxCop शून्य मान के बिना गणनाओं के बारे में शिकायत क्यों करता है (यानी उन प्रविष्टियों में जो प्रत्येक प्रविष्टि के लिए स्पष्ट मान निर्दिष्ट करते हैं), मूल्य 0 के साथ "कोई नहीं" प्रविष्टि का सुझाव देते हैं? क्या ऐसा लगता है कि कृत्रिम "कोई नहीं" आपके उत्तर राज्यों की तरह "नकली" मूल्य है, इसलिए एक निम्न समाधान है? देखें: http://msdn.microsoft.com/en-us/library/ms182149(VS.80).aspx – Pwninstein

+5

शायद FxCop नियम शून्य प्रकारों से पुराना है? –

+2

हाँ, यह मेरे बिंदु पर वापस जा रहा है कि यदि आप एक नामुमकिन उपयोग करते हैं तो आपको एक समझदार डिफ़ॉल्ट मिलता है, जो कि नियम लागू करने का प्रयास कर रहा है। –

2

यदि यह व्यर्थ है, आप इसे एक डिफ़ॉल्ट मान के रूप प्राप्त हैं, तो आप अपवाद मिल चाहते हैं, तो आप इसका इस्तेमाल करने के लिए जब अशक्त (जो एक अच्छी बात है!)

7

तुम बस आप तय करने के लिए है की कोशिश की अज्ञात मानों का प्रतिनिधित्व करने के लिए एक मूल्य की आवश्यकता है, या आपको किसी भी मूल्य की अनुपस्थिति का प्रतिनिधित्व करने के लिए एक तरीका चाहिए।

अज्ञात मूल्यों को प्रस्तुत करने की आवश्यकता के मामले में, एक अतिरिक्त enum-member समाधान के रूप में अच्छा लगता है।

किसी भी मूल्य की अनुपस्थिति का प्रतिनिधित्व करने की आवश्यकता के मामले में, इसे शून्य बना दें।

ध्यान रखें, कि "अज्ञात" enum-member और enum दोनों ही एक ही समय में शून्य होने के साथ कुछ भी गलत नहीं है।

एचटीएच।

15

मैं archimed7592 से सहमत हूं कि अनुपस्थित मूल्य और "अज्ञात" मान के बीच एक वास्तविक अंतर है।

उदाहरण:

"आपका रक्त का प्रकार क्या है?"

  • अशक्त = अनुपस्थित मूल्य -> ​​सवाल का जवाब नहीं किया गया है -> रोगी को इंगित करता है वह नहीं जानता - -> आदेश प्रयोगशाला परीक्षण>

  • "अज्ञात" सवाल पूछने रक्त के प्रकार

5

आईटी भुगतान करता है!

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

मद 8: यह सुनिश्चित करें कि 0 मूल्य प्रकार

के लिए एक वैध राज्य डिफ़ॉल्ट नेट प्रणाली आरंभीकरण सभी 0s को सभी वस्तुओं सेट है।अन्य प्रोग्रामर को किसी मान प्रकार का उदाहरण बनाने से रोकने के लिए कोई तरीका नहीं है जो सभी 0 के लिए प्रारंभ किया गया है। इसे अपने प्रकार के लिए डिफ़ॉल्ट मान बनाएं।

एक विशेष मामला enums है। कभी भी एक enum बनाएँ जिसमें वैध विकल्प के रूप में 0 शामिल नहीं है। सभी enums System.ValueType से व्युत्पन्न हैं। गणना के लिए मान 0 से शुरू होते हैं, लेकिन आप उस व्यवहार को संशोधित कर सकते हैं ...

अब, मुझे ऐसी स्थिति है जहां उपयोगकर्ताओं को कॉम्बोबॉक्स से कुछ प्रकार का चयन करने की आवश्यकता है, या उनके पास कोई प्रकार का चयन नहीं हो सकता है। मैं ऑब्जेक्ट का चयन करने के लिए [Description("a description")] विशेषता के साथ एक enum का उपयोग कर रहा हूँ। यदि कोई भी/अज्ञात एक enum के लिए प्राकृतिक विकल्प नहीं है, तो मैं इसका प्रतिनिधित्व करने के लिए इसका उपयोग करता हूं कि कुछ भी नहीं चुना गया है। अन्यथा, मैं Nullable<MyEnum> का उपयोग करूंगा।

0

एनम को [Flags] विशेषता के साथ जिम्मेदार ठहराया गया है, तो सबकुछ बदलता है।

[Flags] 
    enum FlagsEnum 
    { 
     None = 0, 
     First = 1, 
     Second = 2, 
     Third = 4, 
     FirstAndThird = 5 
    } 
संबंधित मुद्दे