एनम और कॉन्स्टेंट। कब कौन सा उपयोग करना है?


94

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



जावा के लिए समान प्रश्न के लिए stackoverflow.com/questions/11575376/… भी देखें (उत्तर ज्यादातर C # पर भी लागू होते हैं)।
अलेक्सी लेवेनकोव

जवाबों:


95

जब आप कुछ मानों को परिभाषित कर सकते हैं, तो एनम का उपयोग करें। रंग एक स्पष्ट उदाहरण है:

public enum Colour
{
    White,
    Red,
    Blue
}

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

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

पीआई की तरह, एक ही मूल्य के लिए लगातार होना चाहिए। पीआई मानों की कोई सीमा नहीं है, बस पीआई है।

विचार करने के लिए अन्य बिंदु हैं:

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

1
क्या होगा यदि आप .ToString()एनम पर बहुत अधिक उपयोग करते हैं, तो कॉन्स स्ट्रिंग्स के साथ एक क्लास का उपयोग करने में कोई भी मूल्य जो एनम की तरह दिखता है और कार्य करता है, लेकिन कॉल को रोकता है ToString()? उदाहरण
सिनजाई

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

1
हालांकि, आपको एनम के बजाय स्थिर रंगों के साथ सिर्फ एक स्थिर वर्ग रंग क्यों नहीं मिल सकता है? क्या फर्क पड़ता है?
WDUK

संक्षेप मेंType Safety"
आह्मेनाबिल88

30

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

enum LongEnum : long {
    foo,
    bar,
}

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

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

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

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


20

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

लगातार कोई भी डेटा प्रकार हो सकता है लेकिन एक एनुम एक एनम है।

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

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


8

रॉबर्ट के जवाब के अलावा:

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

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


3

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

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


3

enumइसके बजाय उपयोग करते समय एक बात जो मुझे अच्छी constलगती है enum, वह यह है कि आप ए में मूल्यों के माध्यम से पुनरावृत्ति कर सकते हैं , constमूल्यों के साथ ऐसा करना बहुत कठिन है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.