2009-04-02 7 views
9

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

  private enum myEnum 
     { 
      A, 
      B 
     } 
     private void myMethod(myEnum m) 
     { 
      switch (m) 
      { 
       case myEnum.A: 
        //do stuff 
       break; 
       case myEnum.B: 
        //do stuff 
       break; 
       default: 
        throw new NotImplementedException(m.ToString()); 
      } 
     } 

अगर मैंने कभी भी myEnum में तीसरा सदस्य सी जोड़ दिया है, तो मुझे केवल एक रनिटाइम पर चेतावनी दी जाएगी जिसे NotImplementedException

मैं क्या करना चाहता हूं संकलक चेतावनी है जब अनचाहे मामलों और के साथ कोई स्विच नहीं है तो कोई डिफ़ॉल्ट: केस।

क्या ऐसा करने का कोई तरीका है, या इस समस्या के अन्य समाधान, अंतिम लक्ष्य संकलित समय पर चेतावनी दी जा रही है कि कुछ गुम है?

उत्तर

6

दुर्भाग्यवश यहां आपके लिए ऐसा करने के लिए कोई कंपाइलर सुविधा नहीं है।

एक enum होने के बजाय, एक बेस क्लास या एक इंटरफ़ेस है। MyMethod इंटरफ़ेस पर परिभाषित किया गया है।

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

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

संपादित

सबसे अच्छा सलाह मैं दे सकते हैं प्रत्येक समारोह है कि स्विच बयान पर निर्भर करता है के लिए इकाई परीक्षण का निर्माण, और यह गणना में प्रत्येक मान के लिए कॉल करने के लिए (आप के साथ मूल्यों कार्यावधि में प्राप्त कर सकते है एनम क्लास पर GetValues ​​सदस्य)

+0

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

+0

एक अच्छा पैटर्न है, लेकिन इसे देखभाल के साथ उपयोग करें। यदि आपका enum बड़ा है और आपके स्विच को केवल कुछ मामलों को संभालने की आवश्यकता है, तो संभवतः आप एक अरब वर्ग नहीं बनाना चाहते हैं। संपादन के लिए –

+0

+1। =) –

1

नहीं, यह जांचने के लिए भाषा में कुछ भी नहीं है।

तुम एक हो सकता है:

default: 
    throw new ArgumentOutOfRangeException("Invalid value or bug"); 

मामला है, लेकिन स्पष्ट रूप से है कि संकलन समय के बजाय निष्पादन-समय है।

1

इसका कभी भी उपयोग नहीं किया गया, लेकिन FxCop सहायक हो सकता है। यह कस्टम नियम लिखने का समर्थन करता है। बेशक, यह संकलन-समय की जांच नहीं है, लेकिन कुछ ऐसी चीजें जिन्हें आपकी प्रक्रियाओं में एकीकृत किया जा सकता है।

0

यह एक रखरखाव दुःस्वप्न बन सकता है, एक स्विच स्टेटमेंट में एक लापता एनम मूल्य डीबग करने का प्रयास करने के समय का एक looooooot खर्च करना पड़ा।

थोड़ा और रखरखाव अनुकूल अधिक स्विच बयान देने के लिए,

enter image description here

वर्ग है कि सभी enum मूल्यों या तो नियंत्रित किया जाता है या स्पष्ट रूप से नजरअंदाज कर दिया सुनिश्चित करती है एक छोटा सा वर्ग लिखा है, यह किसी भी तरह से NotImplementedExpcetion फेंकता है। बाहर स्रोत कोड

चेक और अधिक जानकारी के here

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