2012-04-10 8 views
56

मैं इस बात के बारे में उत्सुक हूँ ... देख उदाहरण:स्विच केस में अतिरिक्त ब्रेसिज़ का उद्देश्य क्या है?

switch(x) 
{ 
    case(a): 
     { 
     //do stuff 
     } 
     break; 
    case(b): 
     //do stuff 
     break; 
} 

मेरे सभी जीवन मैं इसे मामले ख की तरह किया है, लेकिन जब से सी # मुझे इसका इस्तेमाल करने की अनुमति देता है, और दृश्य स्टूडियो मुझे संक्षिप्त करने के लिए अनुमति देता है वह बात, मैं उत्सुक हूं - एक (ब्रेसिज़ के साथ) और मामले बी के बीच वास्तविक अंतर क्या है?

+15

वहाँ सिवाय इसके कि मामला एक में निर्धारित वेरिएबल कि ब्लॉक में ही दिखाई देते हैं कोई अंतर नहीं है। –

+3

वास्तव में कुछ भी नहीं।यह सिर्फ इतना है कि कभी-कभी आप उस मामले को तैयार करने वाली वस्तुओं को बनाना और उपयोग करना चाहते हैं। ब्रैकेट के बिना आप परिभाषित करते हैं कि आपके पास व्यापक क्षेत्र है। – Robinson

+1

आपने जो नहीं पूछा, लेकिन मुझे पढ़ने के लिए कठिन 'केस' ब्लॉक मिलते हैं। अगर मुझे स्कोपिंग या किसी अन्य जटिलता की आवश्यकता है, तो इसे एक नई विधि मिलती है। –

उत्तर

71

ब्रेसेस {} का संचालन के एक सेट के लिए एक दायरा परिभाषित करने के लिए उपयोग किया जाता है। बिज़ारेलि, निम्नलिखित संकलन और काम करेंगे:

private void ConnectionStateChange(object sender, StateChangeEventArgs e) 
{ 
    string s = "hi"; 
    switch(s) 
    { 
     case "hi": 
      { 
       int a = 1; 
       a++; 
      } 
      { 
       int a = 2; 
       a++; 
      } 
      break; 
    } 

    { 
     int a = 1; 
     a++; 
    } 
    { 
     int a = 2; 
     a++; 
    } 
} 

आप देख सकते हैं, कि एक विधि मैं चार चर बना लिया है, प्रत्येक एक कहा जाता है। प्रत्येक पूरी तरह से अलग है क्योंकि, स्थानीय चर के रूप में, वे केवल अपने ही दायरे में मौजूद होते हैं।

क्या इससे कुछ प्रकार की भावना होती है?

+0

+1 भी देखें। – SouthShoreAK

+0

अच्छी तरह से समझाया, वास्तव में इसकी सराहना करते हैं! – Wish

+55

क्यों विचित्र रूप से? यह बहुत सामान्य दिखता है (हालांकि योगदान हुआ)। – Joey

30

यह एक नया दायरा बनाता है जिसमें आप नए चर बना सकते हैं।

13

यह आपके द्वारा उपयोग किए जाने वाले चर के लिए नया दायरा बनाता है। चर के दायरे कभी-कभी मुश्किल हो सकते हैं। उदाहरण के लिए आपके द्वारा पोस्ट किए गए कोड में;

switch(x) 
{ 
    case(a): 
     { 
     int i = 0; 
     } 
     break; 
    case(b): 
     i = 1; // Error: The name 'i' doesn't exist in the current context 
     break; 
} 

त्रुटि के रूप में में case(b) चर a क्षेत्र से बाहर पहुँचा जा सकता है यहाँ समझ में आता है। अब दूसरी तरफ,

switch(x) 
{ 
    case(a): 
     { 
     int i = 0; 
     } 
     break; 
    case(b): 
     int i = 1; // Error: A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else 
     break; 
} 

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

switch(x) 
{ 
    case(a): 
     { 
     int i = 0; 
     } 
     break; 
    case(b): 
     { 
     int i = 1; // No error 
     } 
     break; 
} 

एरिक Lippert एक बहुत अच्छा link to his blog साझा मामले बयान में चर स्कोप समझाने के लिए। आपको इसे देखना चाहिए।

77

कोष्ठकों (नहीं कोष्ठक - [] - और नहीं कोष्ठकों - () - लेकिन ब्रेसिज़{}) की एक जोड़ी उन में शून्य या अधिक बयानों के साथ सी # में एक कानूनी बयान है, और इसलिए कहीं भी दिखाई दे सकता है कि एक कथन कानूनी रूप से प्रकट हो सकता है।

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

मैं ध्यान दें कि यह एक switch बयान क्योंकि में विशेष रूप से दिलचस्प है एक स्विच में स्कोपिंग नियम थोड़ा अजीब हैं। कैसे अजीब वे कर रहे हैं की जानकारी के लिए, "केस 3:" देख इस विषय पर मेरे लेख में:

http://ericlippert.com/2009/08/13/four-switch-oddities/

+1

+1 सही स्रोत के लिए। –

+0

मुझे हमेशा निराशा हुई है कि सी # ने एक स्मार्ट स्विच स्टेटमेंट नहीं पेश किया है, क्योंकि सी स्विच प्रोग्रामिंग में अधिक विचित्र और समस्याग्रस्त संरचनाओं में से एक है। –

+6

@ नाटेक-के: सी # * किया * एक बेहतर स्विच स्टेटमेंट पेश किया! सी # डिजाइनरों ने सी/सी ++ स्विच स्टेटमेंट की कमियों की बारीकी से जांच की और कई तरीकों से इसका सुधार किया। उदाहरण के लिए: (1) "कोई गिरावट नहीं" नियम बग के एक आम स्रोत को समाप्त करता है। (2) आप तारों पर स्विच कर सकते हैं। (3) आप शून्य प्रकारों पर स्विच कर सकते हैं। (4) केस लेबल के प्रकार स्विच के शासी प्रकार के साथ संगत होने के लिए चेक किए जाते हैं। (5) "गोटो केस 1" ठीक से काम करता है, सी ++ के विपरीत। और इसी तरह; लगभग हर कल्पनीय तरीके से सी # स्विच एक सुधार है। –

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