string.Join的行为

时间:2016-03-16 09:22:10

标签: c# string

我正在使用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会引发异常?输入值相等。

2 个答案:

答案 0 :(得分:10)

因为您正在调用不同的重载:

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[])页面中有一条评论:

  

如果value的第一个元素为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;

答案 1 :(得分:7)

来自documentation(强调我的):

  

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

因此,null的不同处理是设计的。此外,正如xanatos所述,使用a different overload会导致您的异常,因为如果出现ArgumentNullException,则会抛出integral(absolute(offset(metricname, -1))

  

值为空