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