string.Join的行为

fub*_*ubo 4 c# string

我正在使用string.Join()分隔符连接值 - 这是我使用User类的简化示例:

public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的结果:

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
Run Code Online (Sandbox Code Playgroud)

首先,我感到惊讶的是item2,表现不像item1并决定了""而不是";1".

是否允许使用null这样的规则 但不在第一项?

我的问题:为什么会item3返回""item5抛出异常?输入值相等.

xan*_*tos 10

因为您调用不同的重载:

string item5 = string.Join(";", null, uItem.Age, 1); // throws null exception
Run Code Online (Sandbox Code Playgroud)

将会通知

public static string Join(string separator, string[] value, int startIndex, int count);
Run Code Online (Sandbox Code Playgroud)

(尝试在Visual Studio中进行定义并查看).所以你是路过nullstring[] value.

为了

string item2 = string.Join(";", null, 1); // returns ""
Run Code Online (Sandbox Code Playgroud)

页面中有一条评论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"
Run Code Online (Sandbox Code Playgroud)

如果有人感兴趣,那么它不是随机的东西......在String.JoinMicrosoft 的实现中有明确的C#代码:

if (values.Length == 0 || values[0] == null)
    return String.Empty;
Run Code Online (Sandbox Code Playgroud)


Pat*_*man 7

文档(强调我的):

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

所以null的不同处理是设计的.此外,正如xanatos所指出的,使用不同的重载会导致异常,因为它会抛出一个ArgumentNullExceptionif:

value为null

  • 不解释异常,这是应该可以接受两个答案的问题之一 (2认同)