2009-03-12 16 views
51

String Basics पर एमएसडीएन आलेख यह दिखाता है:एक स्ट्रिंग कानूनी में शून्य क्यों जोड़ रहा है?

string str = "hello"; 
string nullStr = null; 
string emptyStr = ""; 

string tempStr = str + nullStr; // tempStr = "hello" 
bool b = (emptyStr == nullStr);// b = false; 
string newStr = emptyStr + nullStr; // creates a new empty string 
int len = nullStr.Length; // throws NullReferenceException 

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

उत्तर

51

MSDN से:

स्ट्रिंग संयोजन कार्यों में, सी # संकलक एक अशक्त स्ट्रिंग कोई रिक्त स्ट्रिंग के समान ही व्यवहार है, लेकिन यह मूल अशक्त स्ट्रिंग के मूल्य में नहीं बदलता। + binary operator पर

अधिक जानकारी:

द्विआधारी + ऑपरेटर स्ट्रिंग संयोजन करता है जब एक या दोनों ऑपरेंड प्रकार स्ट्रिंग के हैं।

यदि स्ट्रिंग कॉन्सटेनेशन का संचालन शून्य है, तो खाली स्ट्रिंग को प्रतिस्थापित किया जाता है। अन्यथा, कोई भी गैर-स्ट्रिंग तर्क वर्चुअल ToString प्रकार ऑब्जेक्ट से प्राप्त विधि को आविष्कार करके अपने स्ट्रिंग प्रस्तुति में परिवर्तित किया गया है।

यदि ToString शून्य लौटाता है, तो खाली स्ट्रिंग प्रतिस्थापित है।

+0

प्रश्न अंततः भाषा डिजाइन तर्क के बारे में था। कुछ लोगों ने अन्य उत्तरों में अनुमान लगाने की कोशिश की है। एमएस से किसी को यहां जवाब देने के लिए हमें किसी की आवश्यकता होगी। –

+0

सी # टीम द्वारा उत्कृष्ट पसंद क्योंकि यह सी # 6 नल-सशर्त ऑपरेटर के साथ एक आकर्षण की तरह काम करने के लिए निकला, खासकर जब सी # 6 स्ट्रिंग इंटरपोलेशन फीचर्स के साथ मिलकर: उदा। 'वापसी $" {व्यक्ति? फर्स्टनाम} {व्यक्ति? LastName} "' – GDS

0

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

+0

यह ऐसा करता है, नहीं * क्यों * यह करता है। –

1

मुझे लगता है कि भाषा (या मानक पुस्तकालय) डिजाइनरों ने फैसला किया है कि यह एक आम मामला होगा कि वे प्रोग्रामर को एक पक्ष करेंगे।

(साफ! मैं हमेशा बस अशक्त साथ एक अपवाद के माध्यम से concating ग्रहण होता!)

3

वैचारिक रूप से, तार सामान्य रूप से के मूल्यों के रूप में माना जाता है के रूप में जिन वस्तुओं पर पहचान के लिए संदर्भ के लिए विरोध किया। मुख्य कारणों में से एक वे struct एस मूल्य semantics के साथ नहीं है, ओवरहेड की वजह से कॉपी-ऑन-असाइनमेंट के साथ आता है। यदि स्ट्रिंग मान थे तो वे शून्य नहीं हो सकते थे और इसलिए null का इलाज केवल "+" ऑपरेटर द्वारा किया जाता है जैसे कि यह एक खाली स्ट्रिंग था (यानी, default(string) == "" जैसे default(int) == 0)।

6

मैं मानता हूं कि अवधारणात्मक तार केवल मूल्य हैं। हालांकि, निम्नलिखित कोड पर विचार करें: अन्य मान प्रकार ऑपरेटरों डिफ़ॉल्ट इस्तेमाल किया() रास्ता स्ट्रिंग ऑपरेटरों "" करने के लिए अशक्त परिवर्तित कर रहे हैं, तो

int? i = null; 
i += 1; // The result of this is that i == null 

, अपने स्पष्टीकरण मतलब होगा।

यह कहना सबसे आसान है कि स्ट्रिंग ऑपरेटर सुविधा के लिए एक शॉर्टकट (विशेष मामला) हैं।

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