我很惊讶地看到一个字符串被初始化为 null,然后在生产环境中附加一些内容的示例。只是闻起来不对劲。
我确信它会抛出空对象异常,但这个大大简化的示例也有效:
string sample = null;
sample += "test";
// sample equals "test"
*请注意,我发现的原始代码将字符串属性设置为 null 并附加到其他地方,因此涉及编译器在编译时优化 null 的答案是无关紧要的。
有人可以解释为什么这可以正常工作吗?
跟进:
根据 Leppie 的回答,我使用 Reflector 来查看 string.Concat 内部的内容。现在很明显为什么会发生这种转换(一点也不神奇):
public static string Concat(string str0, string str1)
{
if (IsNullOrEmpty(str0))
{
if (IsNullOrEmpty(str1))
{
return Empty;
}
return str1;
}
if (IsNullOrEmpty(str1))
{
return str0;
}
int length = str0.Length;
string dest = FastAllocateString(length + str1.Length);
FillStringChecked(dest, 0, str0);
FillStringChecked(dest, length, str1);
return dest;
}
**注意:我正在研究的具体实现(在 Microsoft 的 .Net 库中)不会按照 C# 标准和大多数答案的建议转换为空字符串,而是使用一些测试来简化该过程。最终结果与之前的结果相同,但是就这样:)
the +
字符串的运算符只是简写string.Concat
这只是简单地转变null
在连接之前将参数转换为空字符串。
Update:
string.Concat 的通用版本:
public static string Concat(params string[] values)
{
int num = 0;
if (values == null)
{
throw new ArgumentNullException("values");
}
string[] array = new string[values.Length];
for (int i = 0; i < values.Length; i++)
{
string text = values[i];
array[i] = ((text == null) ? string.Empty : text);
num += array[i].Length;
if (num < 0)
{
throw new OutOfMemoryException();
}
}
return string.ConcatArray(array, num);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)