2009-03-05 2 views
67

मैं enums पर कुछ पढ़ रहा था और उन्हें स्थिरांक घोषित करने के लिए बहुत समान मिल गया। मुझे कैसे पता चलेगा कि एक enum या इसके विपरीत के बजाय निरंतर उपयोग कब करें। Enums का उपयोग करने के कुछ फायदे क्या हैं?Enums और Constants। किसका उपयोग करना है?

+0

यह भी देखें http://stackoverflow.com/questions/755685/c-static-readonly-vs-const –

+0

यह भी देखें http://stackoverflow.com/questions/11575376/why-use-enums-instead-of जावा के लिए समान प्रश्न के लिए कॉन्स्टेंटेंट (उत्तर ज्यादातर सी # पर भी लागू होते हैं)। –

उत्तर

68

जब आप कुछ मूल्यों को परिभाषित करना चाहते हैं तो मानों का उपयोग करें।

public enum Colour 
{ 
    White, 
    Red, 
    Blue 
} 

या हो सकता है की तरह संभव चीजों का एक सेट:: रंग की तरह एक स्पष्ट उदाहरण है (उदाहरण मैं here से चुरा लिया के रूप में मैं आलसी हूँ)

[FlagsAttribute] 
enum DistributedChannel 
{ 
    None = 0, 
    Transacted = 1, 
    Queued = 2, 
    Encrypted = 4, 
    Persisted = 16, 
    FaultTolerant = Transacted | Queued | Persisted 
} 

स्थिरांक एक भी मूल्य के लिए होना चाहिए , पीआई की तरह। पीआई मूल्यों की एक श्रृंखला नहीं है, केवल पीआई है।

+0

क्या होगा यदि आप enum पर '.ToString()' का उपयोग करके समाप्त हो जाते हैं, तो एक स्ट्रिंग वाले वर्ग का उपयोग करने में कोई भी मूल्य जो एक enum की तरह दिखता है और कार्य करता है लेकिन 'ToString() 'पर कॉल को रोकता है? [उदाहरण] (https://hastebin.com/exehipiwut.cs) – Sinjai

+0

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

16

एक निरंतर एक भाषा सुविधा है जो कहती है कि परिवर्तनीय मूल्य नहीं बदलेगा (इसलिए संकलक उस ज्ञान के आस-पास अनुकूलन कर सकता है) जहां एक enum एक विशिष्ट प्रकार है।

कॉन्स्टेंट कोई भी डेटा प्रकार हो सकता है लेकिन एक enum एक enum है।

मैं किसी भी जगह का उपयोग करता हूं जहां आपके पास कई विकल्प हो सकते हैं और कोड की पठनीयता में सुधार करना चाहते हैं। यानी आप मूल्य 0, 1, 2 या त्रुटि, चेतावनी और जानकारी के रूप में enum के रूप में int int के रूप में ट्रेस स्तर हो सकता है।

एनम के पास बिटवाई ऑपरेटरों के रूप में उपयोग करने की क्षमता भी है, यानी FontStyle.Bold | FontStyle.Italic आपको बोल्ड और इटैलिक फोंट देगा।

5

रॉबर्ट के जवाब के अलावा: नामित मूल्यों की एक परिमित सेट के लिए

  1. उपयोग enum। आप वास्तव में प्रत्येक प्रतीक के पीछे संख्यात्मक मूल्य की परवाह नहीं करते हैं (लेकिन आपके पास अभी भी उन्हें लागू करने की क्षमता है, उदाहरण के लिए विरासत प्रणाली के साथ संगतता के लिए)।

  2. रॉबर्ट: हाँ, एनम का उपयोग छोटे क्षेत्रों के रूप में किया जा सकता है। Flags विशेषता का उपयोग करें (और सुनिश्चित करें कि enum के सदस्यों के पास उपयुक्त संख्यात्मक मान हैं)।

3

एक सी # निरंतर एक चर के समान है कि यह एक मूल्य के लिए एक परिभाषित नाम देता है। हालांकि, एक मानक चर से निरंतर भिन्न होता है क्योंकि एक बार परिभाषित किया जाता है, स्थिर को आवंटित मान कभी नहीं बदला जा सकता है। स्थिरांक का मुख्य लाभ स्वयं-दस्तावेज कोड बनाने के साथ-साथ एक ही स्थान पर प्रमुख मूल्यों की घोषणा की अनुमति देने में उनकी सहायता है, जो आसान रखरखाव की अनुमति देता है, मूल्य को अद्यतन करने की आवश्यकता है और सॉफ़्टवेयर को फिर से सम्मिलित किया जाना चाहिए।

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

+0

"गणनाकर्ता सूची"? –

22

अन्य उत्तरों से क्या गुम है यह है कि enums में एक पूर्णांक आधार प्रकार होता है। आप की तरह चार को छोड़कर किसी भी अन्य अभिन्न प्रकार के पूर्णांक से डिफ़ॉल्ट बदल सकते हैं:

enum LongEnum : long { 
    foo, 
    bar, 
} 

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

इसके अलावा, enums का उपयोग करके आपको अधिक प्रकार की सुरक्षा मिलती है। यदि आप उदाहरण का इरादा करना चाहते हैं विधि पैरामीटर के रूप में int स्थिरांक, तो मैं विधि को किसी भी int मान के साथ कॉल कर सकता हूं। अनुमोदित, इसे कास्टिंग के माध्यम से भी enums के साथ हो सकता है, लेकिन यह गलती से नहीं होगा। पैरामीटर के क्रम को भ्रमित करने की संभावना खराब है।

void method(int a, int b) {...} 

तो लगातार एक ही एक और निरंतर बी में जा सकता है ख में केवल जा सकते हैं, तो दो अलग अलग enum प्रकार का उपयोग कर संकलन के दौरान किसी भी दुरुपयोग को उजागर करेंगे।