为什么不是';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,原因是什么?为什么没有字符串连接的标识?这样做是为了方便还是实用?

为什么不是';t空字符串为串联的标识

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还返回一个空字符串。