2

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

4

3 回答 3

6

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

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

基本上,该String.Concat方法旨在展示这种行为。


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

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

于 2013-08-06T00:03:19.253 回答
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;
    }
}

这也记录在案

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

如果你问为什么。我想是因为这样更安全。如果你想连接两个字符串并且其中一个为空,为什么应该null优先而不是string.Empty?

于 2013-08-06T00:04:18.087 回答
1

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

来自 String.Concat:

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

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

于 2013-08-06T00:19:08.167 回答