दिलचस्प पोस्ट
सेलेनियम वेब ड्रिवर के साथ एक स्क्रीनशॉट लें स्थिर कीवर्ड और इसके विभिन्न उपयोग सी ++ में फायरबेज मौजूदा उपयोगकर्ता को बाहर निकालता है मैं जावा में दो स्ट्रिंग कैसे जोड़ूं? UI तालिका दृश्य सेल के अंदर बटन क्लिक करें Linq में बैच बनाएं चेकबॉक्स पर इवेंट बबुलिंग को कैसे रोकें क्लिक करें नि: शुल्क कैसे मुक्त है पता है कि कैसे? जावास्क्रिप्ट कॉल () और लागू () बनाम बाँध ()? क्या किसी पाश में एक चर को घोषित करने के लिए कोई उपरि है? (सी ++) SQL सर्वर में एक अस्थायी तालिका और तालिका चर में अंतर क्या है? for..in और hasOwnProperty ActionBar में कस्टम दृश्य कैसे प्रदर्शित करें? अधिकतम निवेदन लंबाई से अधिक। मैं DataReader को आसानी से <T> कैसे परिवर्तित कर सकता हूं?

मामले की बयानों के बाद हमें ब्रेक क्यों चाहिए?

स्विच में प्रत्येक कोड ब्लॉक के बाद कंपाइलर स्वत: ब्रेक स्टेटमेंट क्यों नहीं रखता है? क्या यह ऐतिहासिक कारणों के लिए है? आप कब एकाधिक कोड ब्लॉक को निष्पादित करना चाहते हैं?

वेब के समाधान से एकत्रित समाधान "मामले की बयानों के बाद हमें ब्रेक क्यों चाहिए?"

कभी-कभी यह एक ही कोड ब्लॉक से संबंधित अनेक मामलों में सहायक होता है, जैसे कि

case 'A': case 'B': case 'C': doSomething(); break; case 'D': case 'E': doSomethingElse(); break; 

आदि बस एक उदाहरण।

मेरे अनुभव में, आमतौर पर यह "के माध्यम से गिर" और एक मामले के लिए कोड के कई ब्लॉक निष्पादित करने के लिए खराब शैली है, लेकिन कुछ स्थितियों में इसके लिए इसके उपयोग हो सकते हैं

ऐतिहासिक रूप से , ऐसा इसलिए है क्योंकि यह case अनिवार्यतः एक label को परिभाषित करता है, जिसे goto कॉल के लक्ष्य बिंदु के रूप में भी जाना जाता है। स्विच स्टेटमेंट और उसके संबंधित मामलों में कोड की एक धारा में कई संभावित प्रविष्टि बिंदुओं के साथ वास्तव में एक बहु-शाखा शाखा का प्रतिनिधित्व किया जाता है

जो सभी ने कहा, यह लगभग अनन्त संख्या का उल्लेख किया गया है कि break लगभग हमेशा डिफ़ॉल्ट व्यवहार है जो आपको हर मामले के अंत में होता था।

जावा सी से आता है और यह सी से वाक्यविन्यास है

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

 class SwitchDemo2 { public static void main(String[] args) { int month = 2; int year = 2000; int numDays = 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: numDays = 31; break; case 4: case 6: case 9: case 11: numDays = 30; break; case 2: if ( ((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0) ) numDays = 29; else numDays = 28; break; default: System.out.println("Invalid month."); break; } System.out.println("Number of Days = " + numDays); } } 

आप सभी प्रकार की रोचक चीजों के साथ-साथ मामले में गिरावट कर सकते हैं।

उदाहरण के लिए, कहें कि आप सभी मामलों के लिए एक विशेष कार्य करना चाहते हैं, लेकिन एक निश्चित मामले में आप उस कार्रवाई को और कुछ और करना चाहते हैं पतन के साथ एक स्विच स्टेटमेंट का उपयोग करना यह काफी आसान होगा।

 switch (someValue) { case extendedActionValue: // do extended action here, falls through to normal action case normalActionValue: case otherNormalActionValue: // do normal action here break; } 

बेशक, मामले के अंत में break बयान को भूलना आसान है और अप्रत्याशित व्यवहार का कारण होता है। अच्छा कम्पाइलर आपको चेतावनी देगा जब आप ब्रेक स्टेटमेंट को छोड़ दें।

मुझे लगता है कि यह एक गलती है एक भाषा के निर्माण के रूप में यह डिफ़ॉल्ट रूप में break करने के लिए उतना ही आसान है और इसके बजाय एक fallthrough कीवर्ड है। मेरे द्वारा लिखे गए और पढ़े गए अधिकांश कोड प्रत्येक मामले के बाद एक ब्रेक है I

स्विच में प्रत्येक कोड ब्लॉक के बाद कंपाइलर स्वत: ब्रेक स्टेटमेंट क्यों नहीं रखता है?

कई मामलों के लिए एक समान ब्लॉक का उपयोग करने में सक्षम होने की अच्छी इच्छा को छोड़कर (जो कि विशेष स्थिति में हो सकता है) …

क्या यह ऐतिहासिक कारणों के लिए है? आप कब एकाधिक कोड ब्लॉक को निष्पादित करना चाहते हैं?

यह सी के साथ संगतता के लिए मुख्य रूप से है, और यकीनन पुरानी दिनों से प्राचीन हैक जब goto खोजशब्द पृथ्वी पर घूमते थे। यह कुछ आश्चर्यजनक चीजों को सक्षम करता है , ज़ाहिर है, जैसे डफ के डिवाइस , लेकिन क्या यह उसके पक्ष में है या इसके विपरीत है … सबसे अच्छा तर्कसंगत

इसलिए आपको कोड को दोहराने की आवश्यकता नहीं है यदि आपको एक ही बात करने के लिए कई मामलों की आवश्यकता होती है:

 case THIS: case THAT: { code; break; } 

या आप ऐसा काम कर सकते हैं:

 case THIS: { do this; } case THAT: { do that; } 

एक झरना फैशन में

वास्तव में बग / भ्रम प्रवण, यदि आप मुझसे पूछें

जावा सी से ली गई है, जिसका विरासत में डफ के डिवाइस के रूप में जाना जाने वाला एक तकनीक शामिल है। यह एक अनुकूलन है जो इस तथ्य पर निर्भर करता है कि नियंत्रण को एक मामले से दूसरे तक, एक break; की अनुपस्थिति में पड़ जाता है break; बयान। सी के मानकीकृत समय के अनुसार, "जंगली में" जैसे बहुत सारे कोड थे, और इस तरह के निर्माण को तोड़ने के लिए भाषा को बदलने के लिए इसका असर नहीं होता।

जहां तक ​​ऐतिहासिक रिकॉर्ड चला जाता है, टोनी हारे ने "संरचित प्रोग्रामिंग" क्रांति के दौरान, 1 9 60 के दशक में मामले का बयान का आविष्कार किया टोनी के केस बयान ने प्रति केस एकाधिक लेबल समर्थित किया और कोई भी बदबूदार break बयान नहीं के साथ स्वचालित निकास। स्पष्ट break लिए आवश्यकता बीसीपीएल / बी / सी लाइन से बाहर आ गई थी। डेनिस रिची (एसीएम एचओपीएल -II में) लिखते हैं:

उदाहरण के लिए, बीसीपीएल स्विचन स्टेटमेंट से बचने वाले एंडकेस को भाषा में मौजूद नहीं था, जब हमने 1 9 60 के दशक में यह सीखा था, और इसलिए बी और सी स्विच स्टेटमेंट से बचने के लिए ब्रेक कीवर्ड का ओवरलोडिंग जागरूक होने के बजाय भिन्न विकास के लिए होता था परिवर्तन।

बीसीपीएल के बारे में मुझे कोई ऐतिहासिक लेखन नहीं मिल पाया है, लेकिन रिची की टिप्पणी से पता चलता है कि break एक ऐतिहासिक दुर्घटना कम या ज्यादा था। बीसीपीएल ने बाद में समस्या तय की, लेकिन शायद रिची और थॉम्पसन यूनिक्स की खोज में बहुत व्यस्त थे ताकि इस तरह के विस्तार से परहेज किया जा सके 🙂

कंपाइलर द्वारा जोड़ा गया एक स्वत: ब्रेक होने के कारण 1 और 2 से ब्रेक कथन को निकालकर 1 <= a <= 3 जैसे स्थितियों के लिए स्विच / केस का परीक्षण करना संभव होता है।

 switch(a) { case 1: //I'm between 1 and 3 case 2: //I'm between 1 and 3 case 3: //I'm between 1 and 3 break; } 

क्योंकि ऐसी स्थितियां हैं जहां आप पहले ब्लॉक के माध्यम से प्रवाह करना चाहते हैं उदाहरण के लिए कई ब्लॉकों में एक ही कोड लिखने से बचने के लिए, लेकिन फिर भी उन्हें नियंत्रित नियंत्रण के लिए विभाजित करने में सक्षम हो। अन्य कारणों का भी एक टन है।

यह एक पुराना सवाल है लेकिन वास्तव में मैं बिना किसी बयान के बगैर मामले का उपयोग कर रहा हूं। ब्रेक का उपयोग नहीं करना वास्तव में बहुत उपयोगी है, जब आपको क्रम में विभिन्न फ़ंक्शन जोड़ना पड़ता है।

जैसे कि टाइम टोकन के साथ उपयोगकर्ता को प्रमाणित करने के लिए http प्रतिसाद कोड का उपयोग करना

सर्वर प्रतिक्रिया कोड 401 – टोकन पुराना है -> टोकन को पुनर्जन्म करें और उपयोगकर्ता को लॉग इन करें
सर्वर प्रतिक्रिया कोड 200 – टोकन ठीक है -> लॉग इन उपयोगकर्ता

मामले में बयान:

 case 404: case 500: { Log.v("Server responses","Unable to respond due to server error"); break; } case 401: { //regenerate token } case 200: { // log in user break; } 

इसका उपयोग करने के लिए आपको 401 प्रतिक्रिया के लिए उपयोगकर्ता फ़ंक्शन में लॉग इन करने की आवश्यकता नहीं है, क्योंकि जब टोकन को पुनर्जन्म किया जाता है, तो रनटाइम 200 मामले में कूदता है।

आप आसानी से दूसरे प्रकार की संख्या, महीने, गिनती को अलग कर सकते हैं।
यह तो बेहतर है यदि इस मामले में;

 public static void spanishNumbers(String span){ span = span.toLowerCase().replace(" ", ""); switch (span){ case "1": case "jan": System.out.println("uno"); break; case "2": case "feb": System.out.println("dos"); break; case "3": case "mar": System.out.println("tres"); break; case "4": case "apr": System.out.println("cuatro"); break; case "5": case "may": System.out.println("cinco"); break; case "6": case "jun": System.out.println("seis"); break; case "7": case "jul": System.out.println("seite"); break; case "8": case "aug": System.out.println("ocho"); break; case "9": case "sep": System.out.println("nueve"); break; case "10": case "oct": System.out.println("diez"); break; } } 

मैं अब परियोजना पर काम कर रहा हूं जहां मुझे अपने स्विच स्टेटमेंट में break ज़रूरत है अन्यथा कोड काम नहीं करेगा। मेरे साथ बरी और मैं आपको एक अच्छा उदाहरण देगा कि आपको अपने स्विच स्टेटमेंट में क्यों break चाहिए

कल्पना करो कि आपके पास तीन राज्य हैं, जो उपयोगकर्ता के लिए संख्या दर्ज करने के लिए इंतजार करता है, दूसरा गणना करने के लिए और तीसरे राशि को प्रिंट करने के लिए।

उस मामले में आपके पास:

  1. राज्य 1 – एक संख्या दर्ज करने के लिए उपयोगकर्ता के लिए रुको
  2. राज्य 2 – राशि प्रिंट करें
  3. स्टेट 3 – योग की गणना करें

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

यहां एक उदाहरण कोड है:

 while(1){ switch(state){ case state1: // Wait for user input code state = state3; // Jump to state3 break; case state2: //Print the sum code state = state3; // Jump to state3; case state3: // Calculate the sum code state = wait; // Jump to state1 break; } } 

यदि हम break उपयोग नहीं करते हैं, तो यह इस क्रम, राज्य 1 , राज्य 2 और राज्य 3 में निष्पादित होगा। लेकिन break का उपयोग करके, हम इस परिदृश्य से बचते हैं, और सही प्रक्रिया में आदेश दे सकते हैं जो राज्य 1 के साथ शुरू होता है, फिर राज्य 3 और अंतिम लेकिन कम से कम राज्य नहीं 2।

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

 public class SwitchTester{ private static final Log log = LogFactory.getLog(SwitchTester.class); public static void main(String[] args){ log.info(monthsOfTheSeason(Season.WINTER)); log.info(monthsOfTheSeason(Season.SPRING)); log.info(monthsOfTheSeason(Season.SUMMER)); log.info(monthsOfTheSeason(Season.AUTUMN)); } enum Season{WINTER, SPRING, SUMMER, AUTUMN}; static String monthsOfTheSeason(Season season){ switch(season){ case WINTER: return "Dec, Jan, Feb"; case SPRING: return "Mar, Apr, May"; case SUMMER: return "Jun, Jul, Aug"; case AUTUMN: return "Sep, Oct, Nov"; default: //actually a NullPointerException will be thrown before reaching this throw new IllegalArgumentException("Season must not be null"); } } } 

निष्पादन प्रिंट:

 12:37:25.760 [main] INFO lang.SwitchTester - Dec, Jan, Feb 12:37:25.762 [main] INFO lang.SwitchTester - Mar, Apr, May 12:37:25.762 [main] INFO lang.SwitchTester - Jun, Jul, Aug 12:37:25.762 [main] INFO lang.SwitchTester - Sep, Oct, Nov 

जैसा सोचा था।

वास्तव में, क्योंकि कुछ चालाक नियुक्ति के साथ आप झरना में ब्लॉक निष्पादित कर सकते हैं।