C# string.Join的行为

C# string.Join的行为,c#,string,C#,String,我使用string.Join()将值与分隔符连接起来-下面是我使用Userclass的简化示例: 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

我使用
string.Join()
将值与分隔符连接起来-下面是我使用
User
class的简化示例:

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);
(请尝试在VisualStudio中执行Go-to定义并查看)。因此,您将
null
作为
字符串[]值传递

为了

string item2 = string.Join(";", null, 1); // returns ""
页面中有一句话:

如果值的第一个元素为null,则连接(字符串, 对象[])方法不连接值中的元素,而是返回String.Empty。此问题有许多解决方法。最简单的方法是为数组的第一个元素赋值String.Empty,如下例所示

我确实认为这(对fist元素的特殊处理)是相当愚蠢的(即使因为没有它)

请注意,另一个重载没有此特殊处理:

string item2bis = string.Join(";", (IEnumerable<object>)new object[] { null, 1 }); // returns ";1"
从(我的)重点:

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

因此,null的不同处理是通过设计实现的。此外,正如xanatos所指出的,使用会导致异常,因为它会在以下情况下引发
ArgumentNullException

值为空


没有解释异常,这是一个可以接受两个答案的问题。这没有解释为什么
item5
抛出异常。它只是说将使用一个空字符串而不是
null
。@TimSchmelter现在应该得到修复。谢谢你的回复,如果没有问题,我会接受这两个答案。不客气@fubo Xanatos做得很好。@fubo:因为他通过了
“;”,uItem.Name,uItem.Age,1
。第一个参数是分隔符,第二个参数是null-
字符串[]
,第三个参数是startindex,最后一个参数是计数。如果他要添加另一个参数,@fubo
string.Join(“;”,null,uItem.Age,1),则将使用
params对象[]
重载;“;”是
string
null
string[]
uItem.Age
int
1
int
很好的答案xanatos,这是“设计缺陷”的一个很好的证明。
if (values.Length == 0 || values[0] == null)
    return String.Empty;