2013-11-26 12 views
7

मैं निम्नलिखित भाव देख रहा था:स्ट्रिंग क्यों है। जॉइन (स्ट्रिंग, ऑब्जेक्ट []) विशेष?

string.Join(",", new object[] { null, "StackOverflow" }) 
string.Join(",", new string[] { null, "StackOverflow" }) 
string.Join(",", new object[] { string.Empty, "StackOverflow" }) 
string.Join(",", new string[] { string.Empty, "StackOverflow" }) 

मैं सोचा होगा कि वे एक ही मूल्य वापसी होगी:

,StackOverflow 

हालांकि, पहली अभिव्यक्ति वास्तव में string.Empty देता है। यह is actually defined behavior:

मूल्यों के पहले तत्व रिक्त है, तो शामिल हों (स्ट्रिंग, वस्तु []) विधि मूल्यों में तत्वों को श्रेणीबद्ध नहीं करता है, लेकिन इसके बजाय String.Empty देता है। इस मुद्दे के लिए कई कामकाज उपलब्ध हैं। सबसे आसान उदाहरण स्ट्रिंग के मान को असाइन करना है। सरणी के पहले तत्व के लिए लक्षण, जैसा कि निम्न उदाहरण दिखाता है।

क्या कोई इस विसंगति के पीछे कारण जानता है?

+0

है ("वैकल्पिक हल", "मुद्दा"), मुझे लगता है कि वह एक बग, न कि किसी इच्छित व्यवहार है ... – Vache

+0

@Vache No, यह जानबूझकर कोडित है। इसे देखने के लिए परावर्तक में खोलें .. –

+0

@ श्रीराम सक्थिवेल हाँ मैं इसे देख सकता हूं, लेकिन नीचे दी गई कुछ पंक्तियां इस व्यवहार के साथ विरोधाभासी प्रतीत होती हैं। पहले तत्व के स्ट्रिंग प्रस्तुति के लिए एक शून्य मान को संभालने वाला 'if' है। – Vache

उत्तर

3

अपने पसंदीदा decompiler में आप देख सकते हैं कि विधि के लिए कोड विशेष व्यवहार के लिए

public static string Join(string separator, params object[] values) 
{ 
    if (values == null) 
    throw new ArgumentNullException("values"); 
    if (values.Length == 0 || values[0] == null) 
    return string.Empty; 
    if (separator == null) 
    separator = string.Empty; 
    StringBuilder sb = StringBuilderCache.Acquire(16); 
    string str1 = values[0].ToString(); 
    if (str1 != null) 
    sb.Append(str1); 
    for (int index = 1; index < values.Length; ++index) 
    { 
    sb.Append(separator); 
    if (values[index] != null) 
    { 
     string str2 = values[index].ToString(); 
     if (str2 != null) 
     sb.Append(str2); 
    } 
    } 
    return StringBuilderCache.GetStringAndRelease(sb); 
} 

हिस्सा जिम्मेदार है

if (values.Length == 0 || values[0] == null) 
    return string.Empty; 

है, लेकिन हम

नीचे कुछ पंक्तियां देख सकते हैं
string str1 = values[0].ToString(); 
    if (str1 != null) 
    sb.Append(str1); 

values[0] == null पर वापस लौटने के लिए यह बहुत अजीब लगता है लेकिनको संभालने के लिए। एमएसडीएन ("मुद्दा", "वर्कअराउंड") पर शब्द के साथ संयुक्त, तथ्य यह है कि यह अधिभार अपेक्षाकृत नया (.NET 4.0) है और तथ्य यह है कि अन्य Join के पास एक अलग कार्यान्वयन है जो पहले तत्व के रूप में null स्वीकार करता है, मुझे एक बग की तरह दिखता है और वास्तव में एक इच्छित अपवाद नहीं है।

बेशक

, यह केवल मेरी व्याख्या और नहीं एक निश्चित जवाब ...

शब्दों की इस प्रकार की साथ
+1

सुनिश्चित नहीं है कि 'मान [0]। ToString() == null' कुछ इंगित करता है। यदि 'मान [0]' शून्य 'था तो यह' NullReferenceException' फेंक देगा। यह सुनिश्चित करने के लिए जांच कर रहा है कि कोई 'टॉस्ट्रिंग' से 'शून्य' वापस नहीं कर रहा है। – Anthony

+0

मेरे लिए यह 'मानों [0] की जांच करना महत्वपूर्ण है। ToString() == null' क्योंकि 'मान [0]' शून्य नहीं हो सकता है लेकिन यह' ToString() ' –

+0

@ एंथनी को ओवरराइड करके शून्य वापस कर सकता है यह मेरा मुद्दा है। हम ऑब्जेक्ट्स को संभालते हैं जिनमें 'शून्य' स्ट्रिंग प्रस्तुति होती है, तो क्यों न 'शून्य' को संभालें? यह मेरे लिए असंगत दिखता है। – Vache

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