我正在使用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中进行定义并查看).所以你是路过null的string[] 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)
| 归档时间: |
|
| 查看次数: |
953 次 |
| 最近记录: |