gpt4 book ai didi

.net - 为什么 string.Join(string, object[]) 很特别?

转载 作者:行者123 更新时间:2023-12-03 18:30:46 25 4
gpt4 key购买 nike

我正在查看以下表达式:

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 .此 is actually defined behavior :

If the first element of values is null, the Join(String, Object[]) method does not concatenate the elements in values but instead returns String.Empty. A number of workarounds for this issue are available. The easiest is to assign a value of String.Empty to the first element of the array, as the following example shows.



有谁知道这种不一致背后的原因?

最佳答案

在您最喜欢的反编译器中,您可以看到该方法的代码是

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 s 有一个不同的实现,接受 null作为第一个元素,它对我来说看起来像是一个错误,而不是真正的异常(exception)。

当然,这只是我的理解,并不是绝对的答案……

关于.net - 为什么 string.Join(string, object[]) 很特别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20228075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com