2012-12-05 18 views
16

This question में अजीब चर गुंजाइश स्विच के बारे में मेरे मन में एक पुराने अनुत्तरित सवाल का मुझे याद दिलाया? C++ हम कई मामलों को एक साथ इस्तेमाल कर सकते हैं (यदि मैं गलत नहीं हूँ), लेकिन सी # में है कि असंभव है और हम ब्रेक के साथ case 1 बंद हो जाना चाहिए ताकि निम्न कोड C++ सही लगता है और सी # में गलत:स्विच बयान

case 1: 
case 2: 
    SomeMethodUsedByBothStates(); 

जब हमारे पास ऐसा व्यवहार नहीं हो सकता है तो हमें case 1 में एएमपी घोषित करने में सक्षम क्यों होना चाहिए और इसे case 2 में देखें? यदि कभी दो मामले एक साथ नहीं होते हैं तो ऑब्जेक्ट को दोनों में क्यों देखा जाना चाहिए?

उत्तर

34

मामले C++ में या सी # में गुंजाइश नहीं बना सकता हूँ। किसी मामले के अंदर घोषित किए गए सभी चर एक ही दायरे में हैं, स्विच स्टेटमेंट का।

switch (personType) 
{ 
    case 1: { 
     Employee emp = new Employee(); 
     emp.ExperienceInfo(); 
     break; 
    } 
    case 2: { 
     Employee emp = new Employee(); 
     // No longer an error; now 'emp' is local to this case. 
     emp.ManagementInfo(); 
     break; 
    } 
    case 3: { 
     Student st = new Student(); 
     st.EducationInfo(); 
     break; 
    } 
    ... 
} 
+4

+1। मैंने अभी कुछ नया सीखा :) धन्यवाद –

5

दूसरा कोड आप से पता चला है सी # में बिल्कुल ठीक है, यह मानते हुए मामला 2 था एक break या return:

case 1: 
    // no code here... 
case 2: 
    SomeMethodUsedByBothStates(); 
    break; 

खाली मामलों के माध्यम से गिर करने की अनुमति है।
क्या है जो किसी मामले-शाखा में कोड होने की अनुमति है। तो, निम्नलिखित अमान्य होगा:

case 1: 
    SomeMethodUsedOnlyByCase1(); 
    // no break here... 
case 2: 
    SomeMethodUsedByBothStates(); 
    break; 

गुंजाइश के बारे में प्रश्न एक अलग से एक है। असल में, दायरा स्विच स्टेटमेंट स्वयं है, केस-शाखा नहीं।

अपने उदाहरण संकलन, बस घुंघराले ब्रेसिज़ जोड़कर अपने स्वयं के मामले-शाखाओं स्कोप देना करने के लिए:

int personType = 1; 
switch (personType) 
{ 
    case 1: 
    { 
     Employee emp = new Employee(); 
     emp.ExperienceInfo(); 
     break; 
    } 
    case 2: 
    { 
     Employee emp = new Employee(); 
     emp.ManagementInfo(); 
     break; 
    } 
    case 3: 
    { 
     Student st = new Student(); 
     st.EducationInfo(); 
     break; 
    } 
    default: 
     MessageBox.Show("Not valid ..."); 
} 
2

जब आप एक मामले के अंदर चर घोषित, उपयोग spesification को धनुकोष्ठक: आप अगर आप उन चर कुछ विशिष्ट मामले में स्थानीय होना चाहता हूँ ब्रेसिज़ का उपयोग करने की जरूरत है।

int personType = 1; 
switch (personType) 
{ 
    case 1: 
    { 
    /// 
    break; 
    } 
    case 2: 
    { 
    /// 
    break; 
    } 
    case 3: 
    { 
     /// 
     break; 
    } 
    ... 
} 
0

दायरा बिल्कुल अजीब नहीं है। स्थानीय चर का दायरा उस बिंदु से है जहां इसे ब्लॉक के अंत में परिभाषित किया गया है जिसमें इसे परिभाषित किया गया है। तो विभिन्न emp चर कथन के बाद { के साथ शुरू होने वाले ब्लॉक के अंत तक प्रत्येक दायरे में हैं और संबंधित } पर समाप्त होते हैं। case लेबल के बारे में कुछ खास नहीं है; वे चर के दायरे को नहीं बदलते हैं।

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