क्या कोई अभी भी सी # में [गोटो] का उपयोग करता है और यदि ऐसा है तो क्यों? [बन्द है]


104

मैं सोच रहा था कि क्या कोई अभी भी C # में "गोटो" कीवर्ड सिंटैक्स का उपयोग करता है और ऐसा करने के लिए क्या संभावित कारण हैं।

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

गोटो कीवर्ड परिभाषा;


3
आपका क्या मतलब है "अभी भी"? क्या समय की अवधि थी लोगों ने इसे हर समय इस्तेमाल किया [सी # में]?
मासिफ

4
@ मासिफ़: "अभी भी" स्पेगेटी कोड के लिए एक प्रस्तावना के रूप में "गोटो" के उपयोग की आधुनिक राय और स्रोत कोड में पठनीयता की कमी पर जोर देना था। बहुत कम ही आपको इस विशेष कीवर्ड सहित कोई कोड उदाहरण दिखाई देता है, जिसके कारण मुझे पहली बार में पूछने में रुचि थी।
ब्रायन स्कॉट

50
यदि पाठक "कोड के इर्द-गिर्द" कूदता है तो यह बुरा अभ्यास है, तो क्या आप "ब्रेक", "जारी", "फेंक" और "वापसी" से भी बचते हैं? वे सभी नियंत्रण प्रवाह में एक शाखा का कारण बनते हैं, कभी-कभी एक गैर-स्थानीय शाखा। "फेंको" आपको यह भी नहीं बताता कि यह कहां है, गोटो के विपरीत।
एरिक लिपर्ट

2
मैं gotoएक लूप को तोड़ने और विशिष्ट स्थिति के अनुसार स्टेटमेंट शुरू करने के लिए वापस जाता हूं
नितिन सावंत

3
मुझे गोटो पसंद है। मैंने इसे टालने के लिए कह रहे लोगों के रुझान के कारण इसे टालने की कोशिश की क्योंकि यह कोड को पढ़ने में कठिन बनाता है। असेंबली लैंग्वेज और ब्रांच स्टेटमेंट्स सीखने के बाद, मुझे लगता है कि कभी-कभी समय होता है, यह कोड को अधिक पठनीय बना सकता है। मुझे लगता है कि एक विधि में कई उपयोग होते हैं और कोड में बहुत नीचे कूदना अच्छे से अधिक नुकसान कर सकता है। लेकिन अगर आप सोच रहे हैं कि यहां एक गोटो अच्छी तरह से काम करेगा, तो एक बार में एक साधारण गोटो आपके पास से बचने के लिए नहीं होना चाहिए, क्योंकि आम सहमति से बचना है।
eaglei22

जवाबों:


93

कुछ (दुर्लभ) मामले हैं जहां गोटो वास्तव में पठनीयता में सुधार कर सकते हैं। वास्तव में, दो उदाहरणों को सूचीबद्ध करने के लिए आपके द्वारा जुड़े दस्तावेज़:

गोटो का एक सामान्य उपयोग किसी विशिष्ट स्विच-केस लेबल या स्विच स्टेटमेंट में डिफ़ॉल्ट लेबल पर नियंत्रण स्थानांतरित करना है।

गोटो का कथन गहरे से गहरे छोरों से बाहर निकलने के लिए भी उपयोगी है।

यहाँ बाद वाले के लिए एक उदाहरण दिया गया है:

for (...) {
    for (...) {
        ...
        if (something)
            goto end_of_loop;
    }
}

end_of_loop:

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


47
आम तौर पर मैं इसे एक अलग तरीके से छोरों को लगाने के लिए रिफ्लेक्टर करने की कोशिश करता हूं, जिसे मैं अभी वापस कर सकता हूं ...
जॉन स्कीट

2
@ हेंज़ी - मैंने गोटो को वारंट होते नहीं देखा है। जैसे जॉन कहते हैं, अगर इसे "वारंट" किया जा रहा है, तो कोड को फिर से शुरू करने की भीख मांग रहा है।
मनोज्ञ

29
लेबल टूटना, गोटो कहने का एक लंबा तरीका है क्योंकि यह एक ही अजीब बात करता है ....
यीशु रामोस

20
@ जीसस लेकिन फिर गोटो के साथ, आप कहीं भी जा सकते हैं। लेबल ब्रेक सुनिश्चित करता है कि आप लूप के ठीक बाहर जा रहे हैं।
मिस्साते जुले

1
जब तक आप साहसी नहीं हो रहे हैं और एक पते के साथ गोटो का उपयोग कर रहे हैं (मैंने इसे पहले किया है) तो उस समस्या को कम किया जाता है। और मुझे संदेह है कि किसी ने गोटो बयानों का फायदा उठाने के लिए अपने सी # और जावा कोड में डिटॉक्स हुक का उपयोग किया है।
जीसस रामोस

65

मुझे यह हिस्सा याद है

switch (a)     
{ 
    case 3: 
        b = 7;
        // We want to drop through into case 4, but C# doesn't let us
    case 4: 
        c = 3;
        break; 
    default: 
        b = 2;
        c = 4;
        break; 
}

कुछ इस तरह से

switch (a)     
{
    case 3: 
        b = 7;
        goto case 4;    
    case 4: 
        c = 3;
        break;     
    default: 
        b = 2;
        c = 4;
        break;
}

देखें यह


17
मैं वास्तव में इसे अभी तक उपयोग करने के लिए सबसे वैध कारण के रूप में देखता हूं। कम से कम इस परिदृश्य में यह प्रोग्रामर के लिए पठनीयता बढ़ाता है कि अनजान लोग एक-दूसरे के बिना ब्रेक स्टेटमेंट में गिर जाते हैं।
ब्रायन स्कॉट

11
@ ब्रायन स्कॉट, वी 4 वेंडेट्टा। जब तक मैं गलत नहीं हूँ पहला कथन C # में संकलित नहीं है। यह प्रोग्रामर की समझ की सहायता करेगा।
जोडेल

2
V4Vendetta आपने पहले कोड स्निपेट पर ब्रेक क्यों लगाया ...? ब्रेक के बिना इसे दिखाना बेहतर था, अन्यथा दोनों स्निपेट्स अलग-अलग चीजें करते हैं। दूसरे उदाहरण में आपको गोटो की आवश्यकता का कारण ठीक है क्योंकि पहले वाला C # में संकलन नहीं करता है (जैसा कि यह C में होगा)।
स्टीफन होल्ट

23

मैं इसका एडुसिंक में बड़े पैमाने पर उपयोग करता हूं कोड के उस प्रकार को दिखाने के लिए करता हूं जो कंपाइलर आपके लिए C # 5 में Async विधियों का उपयोग करते समय उत्पन्न करता है। आपको ब्लॉक में एक ही चीज़ दिखाई देगी।

हालांकि "सामान्य" कोड में, मुझे पिछली बार याद नहीं है कि मैंने इसका इस्तेमाल किया था ...


1
क्या आप इस बात का एक छोटा उदाहरण प्रदान कर सकते हैं कि यह दृष्टिकोण क्यों पसंद किया गया था या यह केवल एक व्यक्तिगत प्राथमिकता थी?
ब्रायन स्कॉट

1
@ ब्रायन: यह वास्तव में स्पष्ट नहीं है कि आपका क्या मतलब है। Eduasync समतुल्य सी # कोड दिखाता है कि कंपाइलर आपके लिए क्या करता है - और यह कोड उत्पन्न करता है जो गोटो का उपयोग करता है, प्रभावी रूप से ...
जॉन स्कीट

9

गोटो कई छोरों को तोड़ने के लिए बहुत अच्छा है, जहां ब्रेक अच्छी तरह से काम नहीं करेगा (त्रुटि की स्थिति के अनुसार), और जैसा कि क्रेजेन ने कहा कि गोटो का उपयोग कंपाइलर द्वारा स्विच स्टेटमेंट और कुछ अन्य चीजों के साथ-साथ उत्पन्न करने के लिए किया जाता है।


7
निश्चित रूप से "ब्रेक" / "जारी रखना" लूप प्रबंधन के लिए बेहतर दृष्टिकोण हैं बजाय कोड संपादक को स्रोत कोड के आसपास कूदने की आवश्यकता है यह समझने की कोशिश कर रहा है कि अगला कदम कहां होता है?
ब्रायन स्कॉट

6
अगर आपके पास नेस्टेड लूप नहीं है।
यीशु रामोस

1
ठीक है, मैं इसे एक वैध परिदृश्य के रूप में देख सकता हूं।
ब्रायन स्कॉट

1
एक त्रुटि स्थिति में, आपको एक अपवाद को फेंकने पर विचार करना चाहिए।
जोडरेल

6
यदि आप एक अपवाद के बिना आंतरिक रूप से त्रुटि को संभालना चाहते हैं तो ऐसा करने का एक वैध तरीका होगा।
जीसस रामोस

8

मुझे कभी याद नहीं है goto। लेकिन शायद यह हमेशा के लिए लूप के इरादे को बेहतर बनाता है जिसे आप वास्तव में कभी नहीं छोड़ना चाहते हैं (नहीं break, लेकिन आप अभी भी returnया throw) कर सकते हैं :

forever: {
  // ...
  goto forever;
}

तो फिर, एक सरल while (true)पर्याप्त होना चाहिए ...

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


लिंक किए गए जवाब की एक "दिलचस्प" उपयोग किया गया है goto.. और while(true) {..}एक दिलचस्प उपयोग नहीं है ..
user2864740

5

कंपाइलर gotoजेनरेट किए गए कोड के विभिन्न टुकड़ों में स्टेटमेंट्स का उपयोग करता है , उदाहरण के लिए जेनरेट किए गए इट्रेटर ब्लॉक टाइप्स में (जेनरेट करते समय yield returnकीवर्ड का उपयोग करते हुए - मुझे पूरा यकीन है कि जेनरेट किए गए XML सीरियलाइजेशन टाइप भी कुछ ही हैंgoto कथन कहीं-कहीं पर भी हैं।

देखें स्वत: जनरेट राज्य मशीनों: इटरेटर ब्लॉक कार्यान्वयन विवरण पर क्यों / कैसे सी # संकलक हैंडल यह कुछ अधिक जानकारी के लिए।

जेनरेट किए गए कोड के अलावा gotoसामान्य कोड में स्टेटमेंट का उपयोग करने का कोई अच्छा कारण नहीं है - यह कोड को समझने में कठिन बनाता है और परिणामस्वरूप अधिक त्रुटि-प्रवण होता है। दूसरी ओर का उपयोग करgoto इस तरह से उत्पन्न कोड में बयानों करना पीढ़ी की प्रक्रिया को सरल बना सकता है और सामान्य रूप से ठीक है क्योंकि कोई भी उत्पन्न कोड को पढ़ने (या संशोधित) करने वाला नहीं है और गलतियों की कोई संभावना नहीं है क्योंकि एक मशीन लेखन कर रही है।

देखें गो-करने के लिए बयान हानिकारक माना खिलाफ एक तर्क के लिए gotoऔर साथ ही इतिहास प्रोग्रामिंग का एक क्लासिक टुकड़ा।


4
यह बेवकूफी है: कई मामले हैं जो गोटो उपयोगी है, जैसा कि अन्य उत्तरों द्वारा सचित्र है। या तो आप उन्हें स्पष्ट रूप से रगड़ें, या केवल यह कह रहे हैं "यह गलत है", ठीक है, गलत है।
ओ ० '।

@ लोरिसिस मैं इसे नहीं खरीद रहा हूं - हर उदाहरण मैंने देखा है जहां गोटो "पठनीयता में सुधार करता है" (यहां उत्तर सहित) कुछ सरल रीफैक्टरिंग के बाद कहीं अधिक पठनीय होगा ।
जस्टिन

3
@Justin नहीं, कभी-कभी नेस्टेड लूप्स कुछ करने का सबसे स्वाभाविक तरीका है, उदाहरण के लिए यदि आप ऐरे की एक विशेषता का पता लगा रहे हैं।
ओ ० '।

6
@ जस्टिन यह हमेशा एक समारोह में है करने के लिए स्पष्ट नहीं है। आप कुछ करने के लिए मजबूर कर रहे हैं (एक समारोह में) बस कुछ से बचने के लिए आप धार्मिक रूप से नफरत करते हैं (गोटो का उपयोग करके)। कुछ गलत करने का स्पष्ट संकेत।
ओ ० '।

3
@ जस्टिन फंक्शन्स की कॉल ओवरहेड है। gotoनहीं करता। कुछ विचार करने के लिए।
दान बेखर

2

प्रोसेसर कम से कम एक जंप इंस्ट्रक्शन को लागू करता है और मुझे यकीन है कि बहुत सारे स्टेटमेंट उनके कार्यान्वयन या व्याख्या में उपयोग करते हैं।

तीसरी या चौथी पीढ़ी के लैंग गेज का उपयोग करने के बारे में एक अच्छी बात यह है कि ये भौतिक विवरण हमसे दूर हैं। जब भी हमें लीक से हटकर रहने के कानून के प्रति सचेत होना चाहिए मुझे लगता है कि हमें अपने औजारों का भी उपयोग करना चाहिए क्योंकि वे ( क्षमा करें ) हैं। अगर मैं कोड और a लिख रहा थाgoto रहा था अच्छे विचार की तरह लग रहा था, तो यह रिफलेक्टर होगा। एक संरचित भाषा का उद्देश्य इन "कूद" से बचना और हमारी इंजीनियरिंग में एक तार्किक प्रवाह बनाना है।

मुझे इसके उपयोग से बचना चाहिए breakलेकिन मैं प्रदर्शन लाभ को नजरअंदाज नहीं कर सकता। हालांकि, अगर मैंने छोरों को घोंसला बनाया है, तो breakइसके लिए पारस्परिक रूप से आवश्यकता है कि रिफ्लेक्टर हो।

यदि कोई इसका उपयोग प्रस्तावित कर सकता है goto है, तो यह बेहतर होगा कि मैं इसे मना कर दूं, मैं खुशी से अपना जवाब वापस ले लूंगा।

मुझे आशा है कि मैं यहां " बाइक शेड " के लिए भागने का दोषी नहीं हूं । जैसे क्रैगन कहते हैं, दिज्क्स्त्र के लिए काफी अच्छा है, मेरे लिए काफी अच्छा है।


1
एक dynamicऑब्जेक्ट लेना और चलना यह ऑब्जेक्ट ग्राफ़ है जिसमें मेरे द्वारा आवश्यक मानों के नीचे आने के लिए कई शब्दकोश हैं। उन तरीकों का उपयोग करने के लिए समझ में नहीं आता है जिनके पास एक पैरामीटर है जो dynamicएक सटीक ऑब्जेक्ट आकृति की अपेक्षा करता है। गोटो के साथ कई परतों को तोड़ना और इन वस्तुओं के संग्रह के माध्यम से चलना जारी रखना। [मेरे पास प्रकार नहीं हैं इसलिए मैं बेहतर पहुंच प्रदान नहीं कर सकता, इसलिए यह प्रतिबिंब या गतिशील है]
क्रिस मैरिसिक

-6

गोटो कभी बेहतर नहीं होता। और जारी रखें, ब्रेक (स्विच / मामले को छोड़कर), (एकाधिक) रिटर्न, और थ्रो भी न्यूनतम न्यूनतम रखा जाना चाहिए। आप घोंसले के छोरों के बीच से कभी नहीं बचना चाहते हैं। आप हमेशा चाहते हैं कि लूप कंट्रोल स्टेटमेंट में सभी लूप कंट्रोल हों। इंडेंटिंग में जानकारी होती है, और ये सभी कथन उस सूचना को दूर फेंक देते हैं। आप सभी इंडेंटिंग को भी निकाल सकते हैं।


10
यदि आप लूप के निष्पादन को बनाए रखने का कोई मतलब नहीं है, तो आप एक लूप से बाहर निकलना चाहेंगे। अन्यथा आप बिना किसी कारण के लूप में अधिक प्रसंस्करण समय बर्बाद कर देंगे।
स्कुलड

12
@ किर्क, यह कुछ भी मात्रात्मक के बजाय एक राय की तरह लगता है?
ब्रायन स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.