2009-12-01 27 views
17

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

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

class BreakTest 
{ 
public static void Main() 
{ 
    for (int i = 1; i <= 100; i++) 
    { 
    if (i == 5) 
     **return;** 
    Console.WriteLine(i); 
    } 
    } 
} 

मैं जानता हूँ कि वापसी (यह परीक्षण करने के लिए कोड लिखने के लिए बाहर निकलने के लिए अगर बयान इसलिए मैं इस बारे में उत्सुक हूँ इस्तेमाल किया जा सकता के रूप में मैं इसे करने की कोशिश कभी नहीं किया है और मेरे सॉफ्टवेयर उपयोग नहीं कर सकते)।

+1

इंडेक्स 1 इंडेंटेशन के कारण है ... :-) –

+1

मैंने इस कोड को एमएसडीएन से कॉपी किया था जैसा कि यह था। – dotnetdev

+4

मुझे पता है, यह सिर्फ एक मजाक था। 1 पर एक इंडेक्स शुरू करना गलत नहीं है, लेकिन इससे कुछ डेवलपर्स अनैच्छिक रूप से जुड़ जाते हैं। –

उत्तर

40

return वर्तमान पद्धति (मुख्य अपने उदाहरण में) बाहर निकल जाएगा। लूप से बाहर निकलने के लिए break का उपयोग करें।

+0

यही वह भेद है जिस पर मैं जंगली था। विधि में निष्पादित करने के लिए ब्याज की कोई और चीज़ नहीं है, तो वापसी करें। – dotnetdev

+1

@ डॉटनेटडेव के लाभ के लिए: अन्य लूप नियंत्रण (अच्छी तरह से, आम तौर पर बोल रहा है) जारी है, जो वर्तमान पुनरावृत्ति को रोक देगा और अगले को शुरू करेगा, जहां ब्रेक और रिटर्न इस और सभी पुनरावृत्तियों से बाहर निकलता है। –

+0

जारी रखें मैं खुश हूं, इसे और अधिक उपयोग करें। वापसी और ब्रेक मैंने थोड़ी देर में उपयोग नहीं किया है। धन्यवाद। – dotnetdev

3

आप ऐसा कर सकते हैं। कॉलिंग return; मुख्य() से बाहर निकल जाएगी। आम तौर पर आप इसके लिए लूप को तोड़ने के लिए break; का उपयोग करेंगे।

कहा जा रहा है, यह अक्सर खराब अभ्यास माना जाता है एक भी समारोह में एक से अधिक रिटर्न के स्थानों को है। कई डेवलपर्स (यदि विधि void साथ घोषित नहीं किया गया है) एक एकल वापसी कथन के लिए पसंद करते हैं। यह कोड को समझने योग्य बिंदु से, और इसलिए बनाए रखना और परीक्षण करना आसान हो सकता है।

+0

मुझे एक ही विधि में कई रिटर्न पॉइंट्स के बारे में महसूस हो रहा है! :) – dotnetdev

+4

और, इसके विपरीत, कुछ कोड पढ़ने और बनाए रखने के लिए आसान है अगर वापसी कथन का उपयोग बड़े सशर्त अभिव्यक्तियों या एकाधिक नेस्टेड सशर्तों के बजाय किया जाता है। इन धार्मिक नियमों में से कुछ ऐसे हैं जो परियोजना की जरूरतों और संदर्भ के आधार पर अधिक पठनीय, रखरखाव करने योग्य या प्रदर्शन करने वाले विचारों के बजाय अंधेरे से लागू होते हैं। (और मैंने सराहना की कि आप इसे निर्धारित करने के बजाए इस दृष्टिकोण के अस्तित्व को इंगित कर रहे हैं, रीड।) –

+0

मुझे नहीं लगता कि यह हमेशा सत्य है, उदाहरण के लिए आप सशर्त ब्लॉक के अंदर बयान देना चाहेंगे अनुचित इनपुट के मामले में जल्दी लौटने के लिए एक समारोह के शीर्ष के पास। हालांकि, आप सही हैं कि ब्रेक लूप से बाहर निकलने का सही तरीका है। –

4

आप निश्चित रूप से आप क्या कह रहे हैं कर सकते हैं। ऐसा लगता है कि आपको चाहिए या नहीं, इस पर 2 शिविर लगते हैं। कुछ ऐसे हैं जो कहते हैं कि फ़ंक्शन से केवल 1 निकास बिंदु होना चाहिए। उनका सुझाव है कि आप रिकॉर्ड करने के लिए है कि आप (और संभवतः किसी भी डेटा है कि आप वापस जाने के लिए की जरूरत है) बाहर निकलने के लिए, और फिर वापस जाने के एक बार आप अपने लूप से बाहर टूट या अपने अगर/किसी और पेड़ के अंत तक पहुंच की जरूरत है एक झंडा चर का उपयोग करना चाहिए ।

व्यक्तिगत रूप से, मैं जब तक वे सममित हैं एक समारोह से कई निकास बिंदुओं के साथ कोई समस्या नहीं है,। "सममित" से मेरा क्या मतलब है? ठीक है, अगर मैं एक पाश के अंदर से वापस जाने के लिए जा रहा हूँ, तो मैं भी लूप (मामले में मुझे लगता है कि मुझे जल्दी वापस जाने के लिए कारण होगा पाश में हालत तक पहुँचने कभी नहीं) के अंत में वापस जाने के लिए चाहते हैं। अगर मैं एक जटिल अगर/किसी और पदानुक्रम के अंदर हूँ और मैं मामलों में से एक के भीतर से लौट, तो मैं उन सभी को भीतर से वापस आ जाएगी।

यहाँ कैसे मैं अपने कोड लिखने के लिए पसंद करते हैं में से कुछ जल्दी उदाहरण हैं:

public string Search(IEnumerable<string> values) 
    { 
     foreach(string value in values) 
     { 
      if(SomeArbitraryCondition()) 
       return value; 
     } 

     return null; 
    } 

    public int PerformAction() 
    { 
     if (SomeArbitraryCondition()) 
     { 
      if (SomeArbitraryCondition()) 
      { 
       return 1; 
      } 
      else 
      { 
       return 2; 
      } 
     } 
     else 
     { 
      if (SomeArbitraryCondition()) 
      { 
       return 3; 
      } 
      else 
      { 
       return 4; 
      } 
     } 
    } 

यह वास्तव में एक कठिन और तेजी से नियम यह है कि मैं के बारे में ज्यादा सोचा है नहीं है, लेकिन यह केवल एक रास्ता है कि मैं इसे लिखना पसंद करते हैं क्योंकि यह मेरे लिए सबसे साफ लगता है। कुछ मामलों में, यह ध्वज चर का उपयोग करने के लिए और अधिक समझ में आता है और बस एक ही स्थान पर लौटता है।

public string Search(IEnumerable<string> values) 
    { 
     string found = null; 
     foreach(string value in values) 
     { 
      if(SomeArbitraryCondition()) 
       found = value; 
     } 

     return found; 
    } 

    public int PerformAction() 
    { 
     int state; 
     if (SomeArbitraryCondition()) 
     { 
      if (SomeArbitraryCondition()) 
      { 
       state = 1; 
      } 
      else 
      { 
       state = 2; 
      } 
     } 
     else 
     { 
      if (SomeArbitraryCondition()) 
      { 
       state = 3; 
      } 
      else 
      { 
       state = 4; 
      } 
     } 

     return state; 
    } 
0

उत्तर रास्ता अतिदेय लेकिन return; अपने पूरे विधि (ताकि आपके लूप से बाहर, भी) बाहर निकल जाएगा अगर इसकी वापसी प्रकार शून्य है। यदि ऐसा नहीं है, तो यह तब तक संकलित नहीं होगा जब तक कि आप विधि के प्रकार को वापस न करें।

1

मन में इन रखें:

  1. आप ऐसा कर सकते हैं, लेकिन अनुशंसित नहीं है क्योंकि यह निष्पादन की वर्तमान पद्धति से स्वचालित रूप से बाहर निकलता है।
  2. भी उपयोगी नहीं है जब पाश के बाद अन्य बयान अनिवार्य हैं कोई बात की स्थिति (यह की वजह से 1 बिंदु में कहा गया व्यवहार है)।
  3. अपने कार्यक्रम में अर्थात हल करने के लिए एक त्रुटि/बग/गलती कई नए को जन्म देता है प्रयास एक लहर प्रभाव बना सकते हैं। यह बिट कॉम्प्लेक्स डिबगिंग करता है।
संबंधित मुद्दे