2008-09-09 6 views
5

यह सवाल एक ऐड-ऑन की तरह है इस questionसी # स्विच: मामले अन्य मामलों के लिए के माध्यम से नहीं गिरने सीमा के

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

switch (month) 
{ 
    case 0: 
     add something to month totals 
    case 1: 
     add something to month totals 
    case 2: 
     add something to month totals 
    default: 
     break; 
} 

वहाँ एक तार्किक इस बयान करता है, तो एक टन को लिखने के लिए बिना सी # में विकल्प है?

if (month <= 0) 
    add something to month 
if (month <= 1) 
    add something to month 
if (month <= 2) 
    add something to month 
.... etc 

उत्तर

11

कई बार जब आप एक विशाल स्विच स्टेटमेंट से शोर देखते हैं या कई यदि एक से अधिक ब्लॉक में आने वाले बयान, तो आप एक खराब डिज़ाइन को दबाने की कोशिश कर रहे हैं।

इसके बजाय, अगर आपने कुछ मिलान किया है या नहीं, तो यह देखने के लिए कि आपने विशिष्टता पैटर्न लागू किया है या नहीं?

foreach(MonthSpecification spec in this.MonthSpecifications) 
{ 
    if(spec.IsSatisfiedBy(month)) 
     spec.Perform(month); 
} 

तो आप बस विभिन्न चश्मा जिनका मिलान आपके द्वारा ऐसा करने के लिए कोशिश कर रहे हैं क्या जोड़ सकते हैं।

यह कहना मुश्किल है कि आपका डोमेन क्या है, इसलिए मेरा उदाहरण थोड़ा सा हो सकता है।

1

वहां पहले से ही एक सवाल इस विषय को संबोधित कर रहे है:

C# switch statement limitations - why?

संपादित करें:

उनका कहना है कि बाहर में मेरा मुख्य उद्देश्य, gentlebeasts, यह है कि लगभग समान नाम के दो सवाल प्रश्नों के पूल में भ्रम जोड़ें।

+0

हाँ ... मैंने इस सवाल में इसे स्वीकार किया .... –

+1

मुझे संबंध (शीर्षक के अलावा) नहीं दिख रहा है। प्रश्न 44 9 05 कुछ सीमाओं की उत्पत्ति के बारे में है। यह प्रश्न एक विशिष्ट सीमा को दूर करने के बारे में है (जिसे दूसरे प्रश्न में भी उल्लेख नहीं किया गया है)। – mweerden

+2

यदि आप यह इंगित करना चाहते हैं कि शीर्षक के साथ कोई समस्या है, तो शायद आपको 'डुप्लिकेट' टैग नहीं जोड़ना चाहिए, लेकिन या तो शीर्षक बदलना चाहिए या स्पष्ट रूप से उल्लेख करना चाहिए कि आपको लगता है कि इसमें कोई समस्या है। – mweerden

1

क्या आप स्थिरांक जोड़ रहे हैं? इसलिए, हो सकता है कुछ इस तरह (सी सिंटेक्स) काम करेगा हैं:

const int addToTotals[] = {123, 456, ..., 789}; 

for(i=month;i<12;i++) 
    totals += addToTotals[i]; 

अगर आप हर महीने निम्नलिखित के लिए योग के लिए निरंतर जोड़ने तुलना में अधिक जटिल बयान की जरूरत है चर या समारोह संकेत के साथ एक समान बात कर सकते हैं।

-Adam

7

सी # स्विच बयान में आप मामलों के माध्यम से गिर सकता है तभी मामला आप

switch(myVar) 
{ 
    case 1: 
    case 2: // Case 1 or 2 get here 
     break; 
} 

हालांकि के माध्यम से गिर अगर आप एक बयान के साथ के माध्यम से गिर करना चाहते हैं चाहते हैं के लिए कोई बयान है आप खतरनाक गोटो

switch(myVar) 
    { 
     case 1: // Case 1 statement 
       goto case 2; 
     case 2: // Case 1 or 2 get here 
      break; 
    } 
+2

गोटो डर क्यों है? इसके अलावा, "गोटो केस" का उपयोग "गोटो स्टेटमेंट" नहीं है। –

+2

मुझे लगता है कि 'ड्रेडेड' शब्द का उपयोग करना उचित है। मैं प्रोग्रामर्स को आसानी से कल्पना कर सकता हूं कि एक केस स्टेटमेंट में 'गोटो केस' का उपयोग करके इसे केस केस से वापस ले जाएं और मूल मामले में वापस लाएं। गोटो स्पेगेटी की ओर जाता है, स्पेगेटी नफरत की ओर जाता है, घृणा से पीड़ित होता है। गोटो अंधेरे पक्ष का मार्ग है। – Ben

0

का उपयोग करना चाहिए उलटे क्रम

में स्विच मामलों लिखें
case 2: 

case 1: 

case 0: 

break; 


default: 

आशा है कि मदद करता है!

+1

सी # यदि किसी अन्य कोड मौजूद है तो मामलों के बीच अभी भी प्रवाह-नियंत्रण कथन (ब्रेक/जारी/वापसी/गोटो/गोटो केस/फेंक) की आवश्यकता है। –

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