簡體   English   中英

string.Join的行為

[英]Behaviour of string.Join

我正在使用string.Join()將值與分隔符連接 - 這是我使用User類的簡化示例:

public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}

這是我的結果:

User uItem = new User() { Age = 10, Name = null };

string item1 = string.Join(";", string.Empty, 1); // returns ";1"  
string item2 = string.Join(";", null, 1); // returns ""        
string item3 = string.Join(";", uItem.Name, uItem.Age, 1); // returns ""
string item4 = string.Join(";", 1, null); //returns "1;"
string item5 = string.Join(";", null, uItem.Age, 1); // throws null exception

首先,我很驚訝item2行為與item1並確定了""而不是";1"

是否允許使用null這樣的規則但不在第一項?

我的問題:為什么item3返回""item5會拋出異常? 輸入值相等。

因為您調用不同的重載:

string item5 = string.Join(";", null, uItem.Age, 1); // throws null exception

將會通知

public static string Join(string separator, string[] value, int startIndex, int count);

(嘗試在Visual Studio中進行定義並查看)。 所以你傳遞null作為string[] value

為了

string item2 = string.Join(";", null, 1); // returns ""

String.Join Method (String, Object[])頁面中有一條注釋:

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

我認為這(第一個元素的特殊處理)是非常愚蠢的(即使因為String.Concat Method (Object[])沒有它)

請注意,另一個重載String.Join<T> Method (String, IEnumerable<T>)沒有這種特殊處理:

string item2bis = string.Join(";", (IEnumerable<object>)new object[] { null, 1 }); // returns ";1"

如果有人感興趣,那么它不是隨機的東西......在Microsoft的String.Join實現中有明確的C#代碼:

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

文檔 (強調我的):

如果separator為null或者除第一個元素以外的任何值元素為null,則使用空字符串(String.Empty)。

所以null的不同處理是設計的。 此外,正如xanatos所指出的,使用不同的重載會導致異常,因為如果出現以下情況,它會拋出ArgumentNullException

value為null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM