2011-01-25 18 views
13

इनमें से दूसरा क्यों अपवाद उत्पन्न करता है जबकि पहला नहीं होता है?नल स्ट्रिंग पर टॉस्ट्रिंग

string s = null; 
MessageBox.Show(s); 
MessageBox.Show(s.ToString()); 

अपडेट किया गया - अपवाद मैं समझ सकता, पेचीदा बिट (मेरे लिए) यही कारण है कि पहले भाग एक अपवाद नहीं दिखाती है। संदेशबॉक्स के साथ ऐसा कुछ भी नहीं है, जैसा कि नीचे दिखाया गया है।

उदाहरण के लिए:

string s = null, msg; 
msg = "Message is " + s; //no error 
msg = "Message is " + s.ToString(); //error 

पहले भाग परोक्ष एक खाली स्ट्रिंग के लिए एक अशक्त परिवर्तित प्रतीत होता है।

+0

करने का सुरक्षित तरीका- देखें [संभावित रूप से शून्य वस्तु के लिए ToString कैसे करें?] (Http://stackoverflow.com/a/3987671) –

+0

स्ट्रिंग या ऑब्जेक्ट पर 'शून्य' क्षति से बचने के लिए, 'obj ?।तार() ?? "" – bvj

उत्तर

3

आप एक अशक्त पर ToString() विधि निष्पादित करने के लिए कोशिश कर रहे हैं। विधि को निष्पादित करने के लिए आपको एक वैध ऑब्जेक्ट की आवश्यकता है।

1

.show समारोह अशक्त जाँच की है और इसे संभाल चाहिए।

+0

जैसा कि अन्य ने कहा है, अपवाद उठाया गया है क्योंकि एक विधि को शून्य संदर्भ पर बुलाया जाता है। वास्तव में – Vinzz

+1

। यह स्पष्ट हिस्सा है। – rcravens

18

क्योंकि आप null संदर्भ पर उदाहरण विधि ToString() पर कॉल नहीं कर सकते हैं।

और MessageBox.Show() शायद अशक्त उपेक्षा और खाली संदेश बॉक्स बाहर मुद्रित करने के लिए लागू किया गया है।

+2

पहला बिट ठीक है, लेकिन मुझे लगता है कि मेरे प्रश्न का संदेशबॉक्स थोड़ा विचलित है, इसलिए मेरा अपडेट। – MartW

0

वजह से, दूसरी कॉल "एस" की एक वस्तु की उम्मीद है एक ToString() विधि अनुरोध को पूरा करने के लिए। तो, पहले .how() कहा जाता है, s.ToString() एक विधि को कॉल करने के प्रयास के साथ विफल हो जाएगा।

दिलचस्प बात यह है कि जबकि .how() सही ढंग से कार्यान्वित किया गया है, ऐसे कई तरीकों से उम्मीद नहीं होती है कि गैर शून्य उदाहरणों को पारित किया जा सकता है। आमतौर पर, जब आप NullObject पैटर्न का उपयोग करते हैं तो कॉलर को इस तरह से निपटना नहीं चाहिए व्यवहार।

0

शायद शो विधि एक शून्य मान को संभालती है और केवल कुछ भी नहीं दिखाती है। एस - एस। टॉस्ट्रिंग() का दूसरा उपयोग विफल रहता है क्योंकि आपके पास चलाने के लिए कोई ToString विधि नहीं है।

12

यह क्योंकि MessageBox.Show() PInvoke के साथ लागू किया जाता है, यह कहता है देशी विंडोज MessageBox() फ़ंक्शन है। जो lpText तर्क के लिए एक नल प्राप्त करने में कोई फर्क नहीं पड़ता। सी # भाषा में शुद्ध .NET इंस्टेंस विधियों (जैसे ToString) के लिए बहुत कठोर नियम हैं, यह हमेशा यह सत्यापित करने के लिए कोड को उत्सर्जित करता है कि ऑब्जेक्ट शून्य नहीं है। इस blog post में उस पर कुछ पृष्ठभूमि जानकारी है।

+3

+1: दिलचस्प और जानकारीपूर्ण! – gbvb

4

दृश्यों concat के पीछे जैसे

string snull = null; 

string msg = "hello" + snull; 

// is equivalent to the line below and concat handles the null string for you. 
string msg = String.Concat("hello", snull); 

// second example fails because of the toString on the null object 
string msg = String.Concat("hello", snull.ToString()); 

//String.Format, String.Convert, String.Concat all handle null objects nicely. 
+2

क्या आप हमें दृश्यों के पीछे * दिखा सकते हैं * क्योंकि मुझे निश्चित रूप से इसे mscorlib में नहीं मिल रहा है ... –

+0

तो क्या आपका मतलब स्ट्रिंग उपयोगिता विधियों को केवल 'शून्य' स्ट्रिंग में परिवर्तित कर दिया गया है यदि मूल्य वापस शून्य है? –

+0

@RobertKoritnik संकलित नमूना कोड पर ildasm.exe का उपयोग करें, और आप देखेंगे कि जेम्स ने क्या लिखा था। – Kobor42

0

अपने अनुवर्ती अप प्रश्न/अपडेट करने के लिए बुलाया जा रहा है इस सवाल का "सी # toString अशक्त" की खोज के लिए गूगल पर काफी उच्च रैंकों के रूप में, मुझे लगता है कि जोड़ना चाहते हैं Convert.ToString(null) विधि एक खाली स्ट्रिंग वापस कर देगा।

हालांकि, सिर्फ अन्य उत्तर की पुष्टि करने, आप इस उदाहरण में string.Concat("string", null) उपयोग कर सकते हैं।

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