为什么空字符串不是串联的标识?

时间:2013-08-05 23:59:37

标签: c# .net

我正在阅读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,这是什么原因?为什么没有字符串连接的标识?它是为了方便还是实用而制作的?

3 个答案:

答案 0 :(得分:6)

String.Concat的文档解释了这种行为:

  

使用Empty字符串代替任何null参数。

基本上,String.Concat方法旨在表现出这种行为。


  

是为了方便还是实用而这样做了?

虽然只有框架设计团队可以直接回答这个问题,但这种行为确实有一些实际的好处。此行为允许您使用null连接字符串而不创建null结果,从而减少大多数代码中所需的显式null检查的数量。如果没有这种行为,someString + "abc"将需要空检查,随之而来的是,保证非空值。

答案 1 :(得分:2)

我必须承认我不理解“字符串连接的身份”。但是,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;
    }
}

这也是documented

  

该方法连接str0和str1;它不会添加任何分隔符。   使用空字符串代替任何空参数

如果您要求为什么。我假设因为这样更安全。如果你想连接两个字符串,其中一个是空的,为什么{@ 1}}应该被赞成而不是null

答案 2 :(得分:1)

因为它使用合同,其目的在Code Contracts描述。

来自String.Concat:

Contract.Ensures(Contract.Result<string>() != null);

请注意,NullString + NullString也会返回一个空字符串。