为什么不是';t空字符串为串联的标识
本文关键字:标识 字符串 为什么不 | 更新日期: 2023-09-27 18:26:29
我正在阅读Eric Lippert的这篇博客文章http://ericlippert.com/2013/06/17/string-concatenation-behind-the-scenes-part-one/#more-1228,并且意识到空字符串不是C#中的串联的标识。我从来没有遇到过让我意识到这是事实的情况,并且一直认为这是一种身份。我认为有一些很好的理由
string NullString = null;
NullString = NullString + String.Empty; // results in and empty string, not null
结果是空字符串而不是null
,原因是什么?为什么没有字符串连接的标识?这样做是为了方便还是实用?
String.Concat
的文档解释了这种行为:
使用空字符串来代替任何null参数。
基本上,String.Concat
方法就是为了展示这种行为而设计的。
这样做是为了方便还是实用?
虽然只有框架设计团队可以直接回答这个问题,但这种行为确实有一些实际的好处。此行为允许您将字符串与null
连接起来,而不创建null
结果,这减少了大多数代码中所需的显式null
检查的数量。如果没有这种行为,someString + "abc"
将需要null检查,而有了它,就保证了非null值。
我必须承认我不理解"字符串连接的身份"。然而,null + string.Empty
不是null
而是string.Empty
的原因是:
因为它是以这种方式实现的。
看看:
public static string Concat(string str0, string str1)
{
if (string.IsNullOrEmpty(str0))
{
if (string.IsNullOrEmpty(str1))
{
return string.Empty;
}
return str1;
}
else
{
if (string.IsNullOrEmpty(str1))
{
return str0;
}
int length = str0.Length;
string text = string.FastAllocateString(length + str1.Length);
string.FillStringChecked(text, 0, str0);
string.FillStringChecked(text, length, str1);
return text;
}
}
这也有记录:
该方法连接str0和str1;它不添加任何分隔符。使用空字符串来代替任何null参数。
如果你问为什么。我想是因为这样更安全。如果你想连接两个字符串,而其中一个都为空,为什么应该选择null
而不是string.Empty
?
因为它使用了一个合约,其目的在代码合约中有描述。
来自String.Concat:
Contract.Ensures(Contract.Result<string>() != null);
请注意,NullString + NullString
还返回一个空字符串。