2012-04-13 8 views
6

this question से, मुझे पता है कि const stringconst चीजों का संयोजन हो सकता है। अब, एक enum सिर्फ cont integers का एक सेट है, है ना? तो क्यों यह ठीक ऐसा करने नहीं करने के लिए:एक कॉन्स स्ट्रिंग में एनम मान कैसे शामिल करें?

const string blah = "blah " + MyEnum.Value1; 

या इस:

const string bloh = "bloh " + (int)MyEnum.Value1; 

और कैसे आप एक स्थिरांक स्ट्रिंग में एक enum मूल्य को शामिल किया जाएगा?

वास्तविक जीवन उदाहरण: जब एक SQL क्वेरी बनाते हैं, तो मुझे "where status <> " + StatusEnum.Discarded होना चाहिए। विशेष रूप से के लिए, enum मामले के लिए, enum स्वरूपण वास्तव में बहुत जटिल है:

+2

क्यों के लिए एक अनुमान के रूप में: एक पूर्णांक श्रृंखलाबद्ध संस्कृति निर्भरता मुद्दों शामिल हो सकता है। आपका 'int.ToString() 'मेरे' int.ToString() 'जैसा नहीं हो सकता है। शायद। केवल अनुमान है। विशेष रूप से, नकारात्मक संख्या, शायद। –

+0

ओह, ठीक है, मैंने उस प्रश्न को नहीं पढ़ा जिसे मैंने बहुत सावधानी से जोड़ा था। तो यह सिर्फ enums के बारे में नहीं है, यह भी एक कॉन्स स्ट्रिंग में कॉन्स पूर्णांक शामिल करना असंभव है। – Zonko

+1

हां; 'const string foo =" abc "+ 1;' स्ट्रिंग मान के लिए –

उत्तर

6

एक वैकल्पिक हल रूप में, आप एक क्षेत्र प्रारंभकर्ता एक स्थिरांक के बजाय का उपयोग कर सकते यानी

static readonly string blah = "blah " + MyEnum.Value1; 

static readonly string bloh = "bloh " + (int)MyEnum.Value1; 

क्यों का सवाल है, [Flags] केस, इसलिए इसे रनटाइम पर छोड़ना समझ में आता है। int मामले के लिए, यह अभी भी संभावित रूप से संस्कृति विशिष्ट मुद्दों से प्रभावित हो सकता है, इसलिए फिर से: रनटाइम तक स्थगित होने की आवश्यकता है।

static readonly string blah = string.Concat("blah ", MyEnum.Value1); 
static readonly string bloh = string.Concat("bloh ", (int)MyEnum.Value1); 

जहां string.Concat.ToString() प्रदर्शन करेंगे: क्या संकलक वास्तव में उत्पन्न करता है यहाँ एक बॉक्स आपरेशन, अर्थात string.Concat(object,object) अधिभार का उपयोग कर, के समान है। इस प्रकार, यह तर्क दिया जा सकता है कि निम्नलिखित थोड़ा और अधिक कुशल है (एक बॉक्स और एक आभासी कॉल से बचा जाता है):

static readonly string blah = "blah " + MyEnum.Value1.ToString(); 
static readonly string bloh = "bloh " + ((int)MyEnum.Value1).ToString(); 

जो string.Concat(string,string) का प्रयोग करेंगे।

+0

+1 विफल रहता है, लेकिन enum के पूर्णांक मान के लिए क्यों? – ABH

4

आपको के बजाय readonly या static readonly का उपयोग करने की आवश्यकता है।

static readonly string blah = "blah " + MyEnum.Value1; 

कारण MyEnum.Value1 const के रूप में इलाज नहीं किया जाता है कि एक विधि कॉल एक स्ट्रिंग के लिए मूल्य में परिवर्तित करने के लिए आवश्यक है, और एक विधि कॉल का परिणाम एक स्थिर मान भी विधि अगर के रूप में व्यवहार नहीं कर रहा है तर्क स्थिर हैं।

+0

ठीक स्पष्टीकरण के लिए समान रूप से – Zonko

+0

@Zonko संस्कृति के मुद्दों? –

+0

@Zonko, संकलित स्वचालित रूप से स्ट्रिंग को संगत करने से पहले एक स्ट्रिंग में कनवर्ट करने के लिए पूर्णांक मान पर 'int32.ToString() 'को कॉल करता है। –

2

आप ऐसा नहीं कर सकते हैं, क्योंकि MyEnum.Value1 और (int)MyEnum.Value1 स्थिर string मान नहीं हैं। असाइनमेंट के समय एक अंतर्निहित रूपांतरण होगा।

उपयोग के बजाय एक static readonly string:

static readonly string blah = "blah " + MyEnum.Value1;