2013-11-26 43 views
7

我看着下面的表達式:爲什麼string.Join(string,object [])是特殊的?

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

如果值的第一個元素爲null,則Join(String,Object [])方法不會連接值中的元素,而是返回String.Empty。此問題的一些解決方法是可用的。最簡單的方法是將String.Empty的值賦給數組的第一個元素,如下例所示。

有誰知道這種不一致性背後的原因是什麼?

+0

有了那種措辭(「解決辦法」,「發行」),我認爲這是一個錯誤,而不是預期的行爲... – Vache

+0

@Vache不,這是有意編碼的。在反射器打開它,看看.. –

+0

@SriramSakthivel是的,我可以看到,但低於幾行有一些代碼,這似乎矛盾的這種行爲。有一個'if'處理第一個元素的字符串表示的空值。 – Vache

回答

3

在你最喜歡的反編譯器,你可以看到,該方法的代碼是

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但處理values[0].ToString() == null。與MSDN上的措辭相結合(「問題」,「解決辦法」),接受null作爲第一要素的事實,這超載是相對較新(.NET 4.0)和事實的其他Join■找不同的實現,它看起來像是一個錯誤,而不是真正意圖的例外。

當然,這只是我的解釋,而不是一個明確的答案......

+1

不確定'values [0] .ToString()== null'表示什麼。如果'values [0]'爲null,它會拋出'NullReferenceException'。它正在檢查以確保某人沒有從'ToString'返回'null'。 – Anthony

+0

對我來說,重要的檢查'值[0]的ToString()== null'因爲'值[0]'不能爲null,但它可以通過重寫返回null'的ToString()' –

+0

@Anthony這就是我的觀點。我們處理具有'null'字符串表示的對象,爲什麼不處理'null'?這對我來說看起來不一致。 – Vache

相關問題