2015-09-10 10 views
14

जब एक जवाब के लिए एक comment पढ़ने मैं निम्नलिखित घोषणा और एक चर प्रारंभ करने का निर्माण देखा ? हुड के नीचे क्या होता है? क्या निम्नलिखित होता है?घोषणा के बिंदु पर एक बाहर तर्क के रूप में एक चर का उपयोग करना

  1. variable पहले शून्य से शुरू हुआ?
  2. फिर int.TryParse (जो एक मान निर्दिष्ट करता है) पास हो गया?
  3. फिर वैकल्पिक रूप से पढ़ें (यदि int.TryParse वापसी true)?
  4. और फिर, एक बार फिर असाइन/प्रारंभ किया गया?
+1

1. नहीं (स्थानीय चर डिफ़ॉल्ट रूप से असाइन नहीं किए जाते हैं) –

+0

2. हां, * आउट * का अर्थ है कि मान –

उत्तर

8

यह एक चाल है जो काम करने के लिए होती है क्योंकि यह केवल सामान्य if-statement का पुनर्लेखन है।इस कोड को इस के बराबर है:

int.TryParse कहा जाता है, variable इस से पहले आरंभ नहीं किया है, लेकिन यह या तो नहीं है:

int variable; 
if (int.TryParse(stringVariable, out variable)) 
    variable = variable; 
else 
    variable = 0; 

क्रम इस प्रकार है। एक out पैरामीटर को एक निश्चित असाइन किए गए चर की आवश्यकता नहीं है। विधि निष्पादन के हिस्से के रूप में, variable को एक मान दिया जाएगा, और int.TryParsetrue या false वापस करेगा।

विधि देता है, तो true तो अभिव्यक्ति का परिणाम variable हो जाएगा और इस प्रकार हम मूल रूप से variable = variable निष्पादित करेंगे।

विधि देता है, तो false तो अभिव्यक्ति का परिणाम बजाय 0 हो जाएगा, और variable अब क्या यह int.TryParse के भाग के रूप में दिया गया था की परवाह किए बिना मूल्य 0 दिया जाएगा। इस मामले में, हालांकि, यह परिवर्तनीय नहीं बदलेगा क्योंकि int.TryParse ने variable को डिफ़ॉल्ट मान दिया है जब यह false देता है जो 0 भी होता है।

यह मूल रूप से एक पंक्ति पर सब कुछ पाने का एक तरीका है।

व्यक्तिगत तौर पर मैं इस तरह इस कोड लिखा है जाएगा:

int variable; 
int.TryParse(stringValue, out variable); 
+0

व्यक्तिगत रूप से मैंने आपकी आखिरी पंक्ति में कोड लिखा होगा, // // अगर TryParse विफल हो जाता है तो यह अतिरिक्त पंक्ति जोड़ता है, यह चर = 0.' शुरू करता है। मुझे यकीन है कि अन्यथा यह वास्तव में मुझे भविष्य में भ्रमित कर देगा :) – CompuChip

6

int variablevariable वाणी, और out variable जरूरी यह initializes। इन दोनों चीजों को variable से पहले कहीं भी किया जाना चाहिए, और out घोषणा के कारण, यह सच है।

के रूप में, लासे वी कार्लसन से बताया TryParse's documentation से, TryParse डिफ़ॉल्ट रूप से होगा यह 0 का मूल्य निर्दिष्ट करता है, तो रूपांतरण विफल रहता है:

जब इस विधि रिटर्न, [return] 32-बिट शामिल रूपांतरण विफल होने पर, यदि रूपांतरण सफल हुआ, या शून्य में मौजूद संख्या के समतुल्य हस्ताक्षरित मान के बराबर हस्ताक्षर मूल्य। (emph मेरा।)

आप त्रिगुट समारोह बाहर का विस्तार हैं, तो आप देखना चाहते हैं:

int variable; 
if (int.TryParse(stringValue, out variable)) 
    variable = variable; 
else 
    variable = 0; 

जो है, में और स्वयं का, एक कानूनी अभिव्यक्ति। दो रास्ते हैं:

  • TryParsevariable के लिए मूल्य प्रदान करती है और सच देता है, खुद को variable का एक काम करने के लिए अग्रणी
  • TryParse0 को variable initializes और झूठे देता है, द्वारा शून्य के रूप variable का काम करने के लिए अग्रणी टर्नरी हालत

यह विशेष रूप से स्पष्ट कोड नहीं है, और मैं इसे करने की अनुशंसा नहीं करता।

+2

असाइन किया जाएगा, असल में, यदि 'TryParse' 'false' लौटाता है, तो उसे अभी भी' चर 'सेट करना होगा, और इस मामले में यह [दस्तावेज] है (https://msdn.microsoft.com/en-us/library/f02979c7 (v = vs.110) .aspx) को '0' में प्रारंभ किया जाना चाहिए: जब यह विधि वापस आती है, रूपांतरण में सफल होने पर, 32 या बिट में हस्ताक्षरित पूर्णांक मान के बराबर 32-बिट हस्ताक्षरित पूर्णांक मान होता है, यदि रूपांतरण सफल होता है, ** या शून्य विफल हो जाता है। ** * (मेरा जोर) * –

+0

@ LasseV.Karlsen धन्यवाद! मैंने जवाब में इसे संपादित कर लिया है। – Zyerah

+0

@ LasseV.Karlsen: हालांकि 'int.TryParse' को हमेशा पास किए गए चर (इसे त्रुटि के मामले में शून्य पर सेट करने) लिखने के रूप में प्रलेखित किया गया है, सामान्य रूप से कोई गारंटी नहीं है कि किसी अन्य भाषा में लिखा गया फ़ंक्शन' लौटने से पहले बाहर पैरामीटर। निजी तौर पर, मुझे लगता है कि "कोशिश करें" पैटर्न 'टी TryComputeSomething (पैराम्स, सफलताऑफ विफलता सफलता) होना चाहिए; 'विफलता मामले' डिफ़ॉल्ट (टी)' लौटने के साथ। [मुझे सफलता या विफलता के लिए परिभाषित सिंगलेट्स के साथ 'सफलताऑफफेलर' कक्षा होगी, लेकिन अधिक जानकारी जोड़ने की क्षमता का समर्थन करना]। – supercat

1

मैंने इसे देखने के लिए विजुअल स्टूडियो नहीं खोला है, लेकिन हाँ, इसकी अनुमति है।

यह सब "stringValue" चर पर निर्भर करता है। यदि यह एक पूर्णांक के लिए पारदर्शी है, int.TryParse सत्य वापस आ जाएगा, और [चर] में एक पूर्णांक मान होगा। यदि नहीं, तो variable को 0

पर पढ़ा जाएगा क्या यह पठनीय कोड के लिए बनाता है? जाहिरा तौर पर नहीं।

10

हाँ आप निष्पादन के लिए सही हैं। आप यह भी देख सकते हैं में MSIL यहाँ उत्पन्न

सी # कोड

string stringValue = "5"; 
int variable = int.TryParse(stringValue, out variable) ? variable : 0; 

MSIL उत्पन्न

1. IL_0000: nop  
2. IL_0001: ldstr  "5" // load string 
3. IL_0006: stloc.0 
4. IL_0007: ldloc.0 
5. IL_0008: ldloca.s variable 
6. IL_000a: call  bool [mscorlib]System.Int32::TryParse(string, int32&) 
7. IL_000f: brtrue.s IL_0014 
8. IL_0011: ldc.i4.0 
9. IL_0012: br.s  IL_0015 
10. IL_0014: ldloc.1 
11. IL_0015: stloc.1 
12. IL_0016: ret 

कौन सा स्पष्ट किया कि यह दृश्य के पीछे है।

स्टेटमेंट 5 वैरिएबल को स्टैक पर आवंटित कर रहा है। स्टेटमेंट 6 विधि को कॉल कर रहा है। स्टेटमेंट 7,8,9 वास्तव में बूल अभिव्यक्ति से बाहर निकल रहे हैं।

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