2012-06-13 12 views
8

निम्नलिखित कोड देखें:TryParse() - यह कोड 0 क्यों लौटाता है, परिणाम 1 होना चाहिए?

string test = ""; 
int output = -1; 

if (int.TryParse(test, out output)) 
{ 
    Console.WriteLine("Parsed"); 
} 

Console.WriteLine(output); 

जब TryParse() विफल रहता है, ब्लॉक के ऊपर छोड़ दिया नहीं किया जाना चाहिए, Console.WriteLine("Parsed") नहीं बुलाया और output का मान एक समान (-1) हो सकता है?

यह 0

+3

आपको 'if'' के अंदर केवल 'आउटपुट' का उपयोग करना चाहिए क्योंकि यह केवल अंदर है कि आप जानते हैं कि पार्सिंग सफल हुई। –

उत्तर

10

TryParse है के कार्यान्वयन अन्यथा लौटने यह संकलन नहीं होगा पहले out पैरामीटर डिफ़ॉल्ट - परवाह किए बिना कि क्या आप बुला ओर से out पैरामीटर initialised है की। यह विधि out पैरामीटर के साथ है और TryParse के लिए विशिष्ट नहीं है।

पार्सिंग विफल होने पर इसे कोड करने वाले लोग default the parameter to zero पर गए।

महत्वपूर्ण हिस्सा आपको लगता है नहीं करना चाहिए कि किसी भी out पैरामीटर तरीकों out पैरामीटर जब यह पारित हो जाता है के मूल मूल्य का सम्मान करेगा है वास्तव में, यह कभी नहीं सम्मान संकलक के रूप में पैरामीटर रिपोर्ट करेंगे कर सकते हैं:।

अ-निरुपित बाहर पैरामीटर 'blah'

आप विधि के अंदर यह करने के लिए आवंटित करने से पहले पैरामीटर मान का उपयोग करने का प्रयास करते हैं की

उपयोग। तो आप वास्तव में गारंटी दे सकते हैं कि आपके द्वारा असाइन किए गए किसी भी मान को out पैरामीटर के रूप में अनदेखा/ओवरराइट किया जाएगा।

+0

धन्यवाद, यह अब सही समझ में आता है हालांकि यह पहली नज़र में बहुत भ्रामक है। – dtsg

+0

@ डुएन वास्तव में यह हो सकता है, लेकिन यह सभी 'आउट' पैरामीटर के उपयोग को रोकता है - डिफ़ॉल्ट के रूप में चुने गए मान के अलावा, यहां कुछ भी' TryParse' 'के लिए विशिष्ट नहीं है। –

2

लौटने अगर यह विफल कहीं भी होगी return false और अगर बयान में कोड निष्पादित नहीं किया जाएगा है।

मामले में रूपांतरण विफल रहता है यह भी retun जाएगा 0 इसलिए output=0

15

MSDN से:

जब इस विधि रिटर्न, संख्या में निहित करने के लिए 32-बिट पर हस्ताक्षर किए पूर्णांक मान बराबर होता है स्ट्रिंग, यदि रूपांतरण सफल हुआ, तो या zero यदि रूपांतरण विफल हुआ।

2

सी #, out पैरामीटर को असाइन किया जाना चाहिए और प्रारंभ में पढ़ा नहीं जा सकता है। (जब एक विधि शुरू होता है, out मापदंडों अप्रारंभीकृत चर की तरह व्यवहार कर रहे हैं।)

इसलिए, output के पिछले मूल्य अप्रासंगिक है। इसे TryParse विधि लिखने वाले लोगों द्वारा ओवरराइट किया जाना था, अन्यथा इसे संकलित नहीं किया जा सका।

उसी समय, TryParse विधि के पास output के पिछले मान तक कोई पहुंच नहीं है। इसलिए, कुछ मूल्य चुना जाना है। इस मामले में, the developers chose 0

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