2011-09-13 16 views
6

निम्नलिखित वर्ग में दो विधियां हैं जिनमें एम 1 शिकायत करती है कि 'सभी कोड पथ एक मूल्य वापस नहीं करते हैं' और एम 2 नहीं करता है।सामान्य सी # प्रश्न

प्रश्न: संकलक वापसी मूल्य के संदर्भ में एम 2 कैसे हल करता है? कैसे NotImplementedException उदाहरण परोक्ष पूर्णांक के रूप में (यदि कोई आंतरिक संकलन समय संकल्प है) casted है

class A 
     { 
      int M1() 
      { 
      } 
      int M2() 
      { 
       throw new NotImplementedException(); 
      } 
     } 
+0

जनरल Seesharp (सलाम) (अगर एक प्रोग्रामर किसी भी त्रुटि से निपटने के तर्क निर्दिष्ट नहीं किया है) SWeko

+0

मुझे लगता है कि सी # विनिर्देश में इस प्रक्रिया का वर्णन नहीं किया गया है, क्या कोई इसे इंगित कर सकता है? – SWeko

+1

@SWeko: इसे ट्रैक किया गया। यहां: http://msdn.microsoft.com/en-us/library/aa664437(VS.71).aspx (अंतिम पैराग्राफ)। – Jon

उत्तर

7

एक विधि हमेशा एक मूल्य के वापस जाने के लिए आवश्यक नहीं है; विशेष रूप से, इसे अपवाद फेंकने से बाहर निकलने की भी अनुमति है (जिस स्थिति में कोई मूल्य वापस नहीं किया जाता है)।

संपादित करें: विशेष रूप से, the rules for the body of a method कि int देता हैं:

  1. विधि के सभी return बयान int
  2. को एक अभिव्यक्ति परिवर्तनीय लौटना चाहिए विधि ब्लॉक के अंत पहुंच योग्य नहीं होना चाहिए

आपके उदाहरण में, संकलक साबित कर सकता है कि M2 हमेशा फेंकने से बाहर निकलता है , इसलिए विधि ब्लॉक का अंत पहुंच योग्य नहीं है (नियम # 2 को संतुष्ट करता है)। return कथन भी नहीं हैं, जो नियम # 1 को भी संतुष्ट करते हैं। इसलिए यह एक वैध विधि परिभाषा है।

दूसरी ओर, M1 नियम # 2 को पूरा नहीं करता है, इसलिए यह कानूनी नहीं है।

आप शायद त्रुटि संदेश जिस पर सभी फेंकने का उल्लेख नहीं है, लेकिन विचार है कि में लगभग वापसी मूल्यों के साथ सभी मामलों तरीकों return कर के बजाय फेंक द्वारा गुमराह कर रहे हैं - संकलक सिर्फ बताता है आप चाहते हैं तो आप शायद करने के लिए भूल गया था।

+0

मेरे WP7 कुंजी पैड के लिए तेज़ है। –

2

अपवाद कोड के प्रवाह को प्रभावित करते हैं। फेंकने के बाद कोई भी बयान निष्पादित नहीं किया जाएगा, संकलक यह साबित कर सकता है कि विधि के माध्यम से पथ से खुश है।

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

http://msdn.microsoft.com/en-us/library/ms173160(v=vs.80).aspx

0

अपवाद को int के रूप में नहीं डाला जाएगा। संकलक जानता है कि यह एक अपवाद है जो हमेशा तक पहुंचाया जाएगा, इसलिए शिकायत नहीं होती है। जब अपवाद मारा जाता है तो यह अपवाद हैंडलिंग ब्लॉक या क्रैश के लिए ढेर को खोल देगा। विधि कॉलर को कभी भी वापस नहीं किया जाएगा।

0

रूप MSDN में कहा गया है,

फेंक बयान प्रोग्राम निष्पादन के दौरान एक विषम स्थिति (अपवाद) की घटना का संकेत किया जाता है।

कोड निष्पादन फेंक बयान में समाप्त हो जाता है, इस कार्यक्रम बंद कर दिया जाता है और एक उपयोगकर्ता के लिए एक अपवाद संदेश दिखाया गया है

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