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,最后一个参数是计数。如果他要添加另一个参数,@fubostring.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;