为什么string.Join(string,object [])是特殊的?
我在看以下表达式:
string.Join(",", new object[] { null, "StackOverflow" })
string.Join(",", new string[] { null, "StackOverflow" })
string.Join(",", new object[] { string.Empty, "StackOverflow" })
string.Join(",", new string[] { string.Empty, "StackOverflow" })
我会认为他们会返回相同的价值:
,StackOverflow
但是,第一个表达式实际上返回string.Empty
。 这实际上是定义的行为:
如果值的第一个元素为null,则Join(String,Object [])方法不会连接值中的元素,而是返回String.Empty。 此问题的一些解决方法是可用的。 最简单的方法是将String.Empty的值赋给数组的第一个元素,如下例所示。
有谁知道这种不一致的原因吗?
在你最喜欢的反编译器中,你可以看到该方法的代码是
public static string Join(string separator, params object[] values)
{
if (values == null)
throw new ArgumentNullException("values");
if (values.Length == 0 || values[0] == null)
return string.Empty;
if (separator == null)
separator = string.Empty;
StringBuilder sb = StringBuilderCache.Acquire(16);
string str1 = values[0].ToString();
if (str1 != null)
sb.Append(str1);
for (int index = 1; index < values.Length; ++index)
{
sb.Append(separator);
if (values[index] != null)
{
string str2 = values[index].ToString();
if (str2 != null)
sb.Append(str2);
}
}
return StringBuilderCache.GetStringAndRelease(sb);
}
负责特殊行为的部分是
if (values.Length == 0 || values[0] == null)
return string.Empty;
但我们可以在下面看到几行
string str1 = values[0].ToString();
if (str1 != null)
sb.Append(str1);
对我来说,返回values[0] == null
但处理values[0].ToString() == null
是很奇怪的。 结合MSDN(“问题”,“解决方法”)的措辞,这个重载是相对较新的事实(.NET 4.0),而其他Join
有一个接受null
作为第一个元素的不同实现的事实,看起来像是一个错误,而不是真正意图的例外。
当然,这只是我的解释而不是确定的答案......
链接地址: http://www.djcxy.com/p/17551.html