2011-05-30 9 views
6

सी # में एक कोड अनुकूलन है कि मुझे दोनों के लिए अनुमति देता लिए खोज रहे हैं एक enum को परिभाषित करने और simultaniously कि enum के प्रकार का एक चर बनाने:सी # में, एक enum और एक ही समय में उस enum के एक उदाहरण को परिभाषित करने का कोई तरीका है?

से पहले:

enum State {State1, State2, State3}; 
    State state = State.State1; 

के बाद (काम नहीं करता है):

enum State {State1, State2, State3} state; 
    state = State.State1; 

क्या ऐसा कुछ भी मौजूद है?

+0

यहां तक ​​कि अगर ऐसा कोई तरीका था, तो यह और अधिक अनुकूलित नहीं होगा। 'enum राज्य {राज्य 1, राज्य 2, राज्य 3}' रन-टाइम पर कुछ भी लागत नहीं है। –

उत्तर

8

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

उदाहरण के लिए, tuples का उपयोग कर, आप यह कर सकते हैं:

var someFakeEnum = Tuple.Create(0, 1);

अद्यतन:

सी # 7 शुरू की है वाक्यात्मक tuples:

var someFakeEnum = (State1: 0, State2: 1); 

या के साथ अनाम प्रकार :

var someFakeEnum = new { State1 = 0, State2 = 1 };

और, उसके बाद, आप की तरह कुछ कर सकते हैं: जाहिर है यह एक वास्तविक गणना नहीं है

int state = 0; 

// If you're using tuples... 
if(some condition) 
{ 
    state = someFakeEnum.Item2; 
} 

// ...or if you're using anonymous types or C# >= 7 tuples... 
if(some condition) 
{ 
    state = someFakeEnum.State2; 
} 

और आप चीनी कि Enum प्रकार आप के लिए प्रदान करता है की जरूरत नहीं है, लेकिन आप अभी भी बाइनरी ऑपरेटरों जैसे OR, AND या सशर्त जैसे किसी अन्य वास्तविक गणना का उपयोग कर सकते हैं।

+0

मुझे नहीं पता कि कभी-कभी हम डाउनवॉट क्यों प्राप्त करते हैं O_o –

+0

यह स्थिर नहीं होने के कारण 'स्विच' के लिए काम नहीं करता है। 'var someFakeEnum = {state1 = 0, State2 = 1}; 'काम नहीं करता है, वहां' नया 'होगा। – Haocheng

+0

@ हाओचेंग फिक्स्ड। मैंने 'स्विच' भाग हटा दिया। यह गलत था। –

1

नहीं, यह मौजूद नहीं है। न ही यह बहुत पठनीय IMHO

+0

मुझे सी/सी ++ में इसके साथ कभी समस्या नहीं थी। सी # में यह असामान्य लग रहा है – Dyppl

2

सी/सी ++ से स्विचिंग, मुझे लगता है?

नहीं, यह

6

यह एक अनुकूलन नहीं है नहीं कर सकते।

नहीं, ऐसा कुछ भी मौजूद नहीं है, और अच्छे कारण के लिए। यह बहुत कम पठनीय है और ऐसा करने में प्राप्त होने के लिए बिल्कुल शून्य लाभ प्राप्त होता है। उन्हें दो अलग-अलग बयान में घोषित करें और इसके साथ किया जाए।

आप सचमुच, अपने स्रोत कोड में लाइनों की संख्या को कम इसे इस तरह लिखने के लिए भुगतान प्राप्त करना है, तो:

enum State {State1, State2, State 3}; State state = State.State1; 

(हां, यह एक मजाक है ज्यादातर।।)

+2

मुझे आश्चर्य है कि मैं शुरुआती प्रोग्रामर के लिए मेरी सलाह में व्यंग्यात्मक रूप से कितना भयानक कोड उत्पन्न करता हूं .. – Dyppl

+1

इनलाइन एनम वास्तव में उपयोगी होगा जब एनम का उपयोग विधि पैरामीटर को परिभाषित करने के लिए बहुत सीमित है, जहां यह केवल कुछ राज्यों को स्वीकार करता है और वास्तव में आपके नामस्थान में समर्पित एनम प्रकार रखने के लिए कोई उपयोग नहीं है। यह सी # 6.0 में बेहतर महसूस किया जा सकता है जो स्थैतिक सदस्यों के उपयोग को सरल बनाता है। – orad

0

नहीं, सी # घोषणा या एक प्रकार में और चर का घोषित करने के लिए उस प्रकार का उपयोग अलग हैं।

सी/सी ++ में सीधे एक प्रकार की घोषणा और उपयोग करना आम है, उदाहरण के लिए struct कीवर्ड के साथ। सी # में वे अलग हैं।

ध्यान दें कि सी # में आप एक enum (या एक class या एक struct) घोषित करने के बाद अर्धविराम की जरूरत नहीं है:

enum State { State1, State2, State3 } 

हालांकि यह अभी भी अनुमति दी गई है, शायद सी के साथ एक छोटे से अधिक संगत होना/सी ++ वाक्यविन्यास।

संबंधित मुद्दे