2013-08-30 3 views
12

एक नेस्टेड लूप से बाहर निकलने के लिए एक रास्ता शोध करने के बाद, मैं, goto उपयोग करने का प्रयास करने के लिएमैं विधि के अंत में एक गोटो लेबल क्यों नहीं जोड़ सकता?

private void example() 
{ 
    for (int i = 0; i < 100; i++) 
    { 
     for (int ii = 0; ii < 100; ii++) 
     { 
      for (int iii = 0; iii < 100; iii++) 
      { 
       goto exitMethod; 
      }     
     }    
    } 

exitMethod: 
} 

लेकिन किसी कारण से, अगर मैं दृश्य स्टूडियो में कहें, एक goto लेबल विधि के अंत में है 2012 (का निर्णय लिया अंतिम) की शिकायत है (और यह संकलन नहीं होगा),

Screenshot

लेकिन अगर मैं इस के लिए मेरे कोड, बदल

private void example() 
{ 
    for (int i = 0; i < 100; i++) 
    { 
     for (int ii = 0; ii < 100; ii++) 
     { 
      for (int iii = 0; iii < 100; iii++) 
      { 
       goto exitMethod; 
      }     
     }    
    } 

exitMethod: 

    int someUnneededVariable; // Just an example, if I add ANY piece of code the error vanishes. 
} 

कोई भी त्रुटि प्रकट नहीं होती है (और यह संकलित); मैंने उन सभी एमएसडीएन संदर्भों के माध्यम से खोज की है जिन्हें मैं जानता हूं, और मुझे इसके बारे में कुछ भी नहीं मिला।

मुझे पता है कि मैं आसानी से return; का उपयोग करके इस समस्या का समाधान कर सकता है; फिर भी, मैं अभी भी यह जानना चाहूंगा कि इस त्रुटि का कारण क्या है।

+0

मुझे पता है; लेकिन यह सिद्धांत है, मेरी समझ से संकलन करना चाहिए, लेकिन ऐसा नहीं है। – Sam

+1

@ सैम: नहीं, यह वास्तव में नहीं होना चाहिए :) –

+0

आपको लेबल के बाद कुछ कोड लिखना चाहिए। या अटली ';' लेबल के बाद ताकि दृश्य स्टूडियो समझ सके कि इसके बाद और कोड नहीं है। –

उत्तर

18

एक लेबल अपने आप ही मौजूद नहीं है: यह एक बयान लेबल करता है। सी # 5 spec के सेक्शन 8.4 से:

लेबल किए गए-कथन एक लेबल द्वारा उपसर्ग करने के लिए एक कथन को अनुमति देता है। ब्लॉक में लेबल किए गए कथन की अनुमति है, लेकिन एम्बेडेड कथन के रूप में अनुमति नहीं है।

इस मामले में, आप विधि के अंत में लेबल लागू कर रहे हैं - कोई बयान है यह के लिए एक लेबल होने के लिए। तो संकलक आपके कोड को अस्वीकार करने का बिल्कुल सही है। , के रूप में इरफान ने सुझाव दिया

exitMethod: 
    return; 
} 

... या सिर्फ एक खाली बयान:

तुम सच में करना चाहता था, तो आप एक लेबल एक अन्यथा-अनावश्यक वापसी कथन को जोड़ सकते हैं। यद्यपि कथन होना चाहिए।

लेकिन मैं इसकी अनुशंसा नहीं करता। बस return पर किसी भी goto exitMethod; कथन को बदलें।

1

इस मामले

goto exitMethod; 

में सादे

return; 

के बराबर है और उस योजना वापसी काफी अधिक पठनीय है। तो मुझे नहीं पता कि आप ऐसा क्यों करना चाहते हैं।

0

आपको goto के लिए कुछ करने की आवश्यकता है। यह खाली नहीं हो सकता है।

उदाहरण के लिए:

private void example() 
{ 
    for (int i = 0; i < 100; i++) 
    { 
     for (int ii = 0; ii < 100; ii++) 
     { 
      for (int iii = 0; iii < 100; iii++) 
      { 
       goto exitMethod; 
      }     
     }    
    } 

exitMethod: 
    int i = DoSomething(); 
} 
+0

अच्छा, तकनीकी रूप से वह सही है। विधि में अंतिम निर्देश किसी प्रकार का "वापसी" निर्देश है और इसके पहले कोई गोटो लेबल नहीं डालने का कोई कारण नहीं है। पर क्यों। –

0
"The goto statement transfers the program control directly to a labeled statement." 

आप अपने लेबल के रूप में exitMethod है, लेकिन अपने पहले उदाहरण में आप कोई बयान दिया है। यही कारण है कि आपको एक त्रुटि मिल रही है।

goto reference

9

आप खाली बयान दे सकते हैं।

प्रयास करें:

exitMethod: ;    

लेकिन वैसे भी, अगर तुम सच में वर्तमान पद्धति, उपयोग वापसी कथन से वापस जाने के लिए चाहते हैं।

return (type); 

अन्यथा

return; 
0

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

फिर से, आपको इस तरह से एक गोटो का उपयोग नहीं करना चाहिए। यदि आपको बस फ़ंक्शन से बाहर निकलने की आवश्यकता है, तो आप return; कथन का उपयोग कर सकते हैं। यदि कोडिंग मानक आप केवल एक ही रिटर्न पॉइंट को निर्देशित कर रहे हैं, तो इस तरह कुछ कोशिश करें:

private void example() 
{ 
    bool escaping = false; 
    for (int i = 0; i < 100 && !escaping; i++) 
    { 
     for (int ii = 0; ii < 100 && !escaping; ii++) 
     { 
      for (int iii = 0; iii < 100 && !escaping; iii++) 
      { 
       escaping = true; 
       break; // this is only needed if there is code farther down this 
         // inner loop that would otherwise be executed. 
      }     
     }    
    } 

return; 
} 
+0

यदि ओपी इसे डिबग करने या इसे संशोधित करते समय कोड में अस्थायी परिवर्तन करना चाहता है, तो गोटो बनाने के लिए एक उपयोगी अस्थायी परिवर्तन है। आपका परिवर्तन बहुत कठिन है। –

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

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