2009-07-17 13 views
10

अगर मैं इस सी # कोड चलानेInt32.TryParse कनवर्ट करने में सक्षम नहीं होने पर आउट पैरामीटर को रीसेट क्यों करता है?

int realInt = 3; 
string foo = "bar"; 
Int32.TryParse(foo, out realInt); 

Console.WriteLine(realInt); 
Console.Read(); 

मैं 0. मिल और मुझे पता है क्यों करना चाहते हैं! क्योंकि मुझे ऐसा कोई कारण नहीं मिल रहा है कि ऐसा क्यों होगा। यह मुझे हर पार्सिंग के लिए अस्थायी चर बनाने के लिए मजबूर करता है। तो कृपया! ब्रह्मांड के महान कोडर, मुझे प्रबुद्ध!

+0

मैं तुम्हारे लिए कोड स्वरूपित:

आप इसे के रूप में लिख सकते हैं। अगली बार, यदि आप मार्कडाउन संपादक में कुछ प्रारूपित करने के बारे में अनिश्चित हैं, तो टेक्स्ट क्षेत्र के ऊपर छोटी टूलबार का उपयोग करें। एक कोड स्वरूपण विकल्प है। – OregonGhost

+0

मदद के लिए धन्यवाद =) –

उत्तर

33

यह "बाहर" है, न कि "रेफरी"। विधि के अंदर में को "आउट" के अर्थ को पूरा करने के लिए इसे निर्दिष्ट करने के लिए (इसे पहले पढ़ने के बिना) असाइन किया गया है।

असल में, "आउट" भाषा चिंता (एक ढांचा नहीं है) - इसलिए एक प्रबंधित सी ++ कार्यान्वयन शायद इसे अनदेखा कर सकता है ... लेकिन यह इसका पालन करने के लिए अधिक संगत है।

हकीकत में; यदि विधि गलत लौटती है तो आपको केवल मूल्य को नहीं देखना चाहिए; इसे तब तक कचरा के रूप में पेश करें जब तक कि इसे अगली सौंपा न जाए। यह 0 लौटने के लिए कहा जाता है, लेकिन यह शायद ही कभी उपयोगी है।


इसके अलावा - अगर यह ऐसा नहीं करता है (यानी यदि यह मूल्य संरक्षित करता है); यह प्रिंट क्या होगा:

int i; 
int.TryParse("gibber", out i); 
Console.WriteLine(i); 

यह पूरी तरह मान्य सी # है ... तो यह क्या प्रिंट करता है?

+2

* क्यों * यह इस तरह है, यह एक स्पष्टीकरण है कि आप यह कह सकते हैं कि वेरिएबल * हमेशा * को 'TryParse' कॉल के बाद किसी भी कोड में सेट किया गया है, भले ही चर पहले कोड में प्रारंभ नहीं किया गया था (इसलिए जब आप 'TryParse' कॉल के बाद चर का उपयोग करते हैं तो संकलक एक त्रुटि नहीं फेंकता है;' ref' कीवर्ड 'का उपयोग करने वाले फ़ंक्शन के साथ ऐसा करने का प्रयास करें। – Blixt

6

The Int32.TryParse Method (String, Int32) doc का कहना है:

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

परिणाम

प्रकार: System.Int32

जब इस विधि रिटर्न, संख्या रों में निहित करने के लिए 32-बिट पर हस्ताक्षर किए पूर्णांक मान बराबर है, यदि रूपांतरण सफल रहा, शामिल या शून्य यदि रूपांतरण असफल। रूपांतरण विफल रहता है यदि एस पैरामीटर शून्य संदर्भ (विजुअल बेसिक में कुछ भी नहीं है), सही प्रारूप का नहीं है, या MinValue से कम संख्या या MaxValue से अधिक का प्रतिनिधित्व करता है। यह पैरामीटर अनियमित हो गया है।

+0

@Luke - look बोल्ड में थोड़ा सा ... –

+0

@Marc: टिप्पणी करने के बाद वह दूसरा पैराग्राफ जोड़ा गया था। (टिप्पणी अब हटा दी गई है।) – LukeH

0

क्योंकि (कम से कम सी #) विधि जो एक या अधिक आउट पैरामीटर लेती है उसे गारंटी देनी चाहिए कि वे उन्हें वापस लिख दें। इस तरह आपको किसी विधि में तर्क के रूप में पास करने से पहले किसी विधि में स्थानीय फ़ील्ड को प्रारंभ करने की आवश्यकता नहीं है।

0

मेरा अनुमान है कि यह सी # कल्पना का हिस्सा है है:

10.5.1.3 आउटपुट पैरामीटर ... एक विधि के भीतर, सिर्फ एक स्थानीय चर की तरह, एक आउटपुट पैरामीटर शुरू में माना जाता है> असाइन नहीं किए गए और इसके मूल्य का उपयोग करने से पहले निश्चित रूप से असाइन किया जाना चाहिए।

विधि के प्रत्येक आउटपुट पैरामीटर को विधि रिटर्न से पहले निश्चित रूप से असाइन किया जाना चाहिए।

यदि ऐसा है, तो आपको परिणामी मूल्य पर भरोसा नहीं करना चाहिए।

0

TryParse पर दूसरा पैरामीटर out पैरामीटर TryParse पैरामीटर पैरामीटर को प्रारंभ करने के लिए मजबूर किया गया है। out के बजाय पैरामीटर ref था, तो आपको वांछित व्यवहार प्राप्त होगा। हालांकि, TryParse विधि केवल एक संख्या को आउटपुट करने की आवश्यकता है और इनपुट के रूप में कोई संख्या नहीं प्राप्त out पैरामीटर के लिए उचित विकल्प है।

2

क्योंकि इस तरह 'आउट' अनुबंध काम करता है। जब भी आप एक कार्य के लिए out परम पास करते हैं, तो इसे प्रारंभ करने के लिए फ़ंक्शन की ज़िम्मेदारी होती है।

1

Int32.TryParse के लिए MSDN प्रलेखीकरण कहा गया है कि यदि रूपांतरण विफल रहता परिणाम हमेशा वापस आ जाएगी 0.

आप आमतौर पर या तो एक अस्थायी परिणाम चर यानी

int value; 
bool succeeded = Int32.TryParse("astring", out value); 
if (succeeded) 
{ 
    // use value in some way 
} 

का उपयोग करने वाले हैं या फिर आप लपेट अगर एक कथन

int value; 
if (Int32.TryParse("astring", out value)) 
{ 
    // use value in some way 
} 

व्यक्तिगत रूप से मुझे बाद वाला बेहतर विकल्प मिल गया।

4

क्योंकि पैरामीटर एक आउट पैरामीटर है, इसलिए आपको realInt प्रारंभ करने की आवश्यकता नहीं है जब आप इसे घोषित करते हैं, क्योंकि संकलक देख सकता है कि आप इसे किसी विधि पर पास कर रहे हैं जिसे इसे किसी चीज़ पर सेट करने की गारंटी है (क्योंकि "आउट" का)।

अब, क्योंकि यह एक आउट पैरामीटर है क्योंकि TryParse को इसे किसी चीज़ पर सेट करने की आवश्यकता है। यह 0 पर सेट करता है क्योंकि यह सी # में अधिकांश स्थितियों के तहत एक int के लिए डिफ़ॉल्ट मान है।

int realInt; 
string foo="bar"; 
if(int.TryParse(foo,out realInt)==false) 
{ 
    realInt=3; 
} 
+1

इसे लिखने का बेहतर तरीका सिर्फ एक रखना होगा! TryParse की शुरुआत में ऑपरेटर i.e. अगर (! Int32.TryParse (foo, realInt बाहर)) – James

1
public static class IntHelper 
{ 
    public static bool TryParse(string s, ref int outValue) 
    { 
     int newValue; 
     bool ret = int.TryParse(s, out newValue); 
     if (ret) outValue = newValue; 
     return ret; 
    } 
} 
संबंधित मुद्दे