如何在C#中附加空字符串?

Gon*_*ing 45 .net c# string null

我很惊讶地看到一个字符串初始化为null然后在生产环境中附加了一些内容的示例.它只是闻到了错误.

我确信它会抛出一个null对象异常但这个大大减少的例子也有效:

string sample = null;
sample += "test";
// sample equals "test"
Run Code Online (Sandbox Code Playgroud)

*注意我发现的原始代码将字符串属性设置为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;
}
Run Code Online (Sandbox Code Playgroud)

**注意:我正在研究的具体实现(在Microsoft的.Net库中)不会像C#标准和大多数答案所建议的那样转换为空字符串,而是使用一些测试来简化该过程.最终的结果就像它一样,但你去了:)

lep*_*pie 47

+字符串的运算符只是简写,在串联之前string.Concat简单地将null参数转换为空字符串.

更新:

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 显然这是OP的正确答案,但在.NET中,"abc"+ null == null是否真的如此?经典地,null是"非值",因此对通用"null"的操作是不确定的.我总是被告知"null不是空的",根据定义,这是正确的; null!= String.Empty,这就是我们有String.IsNullOrEmpty()的原因. (2认同)

Ras*_*ber 7

相关引文应为ECMA- 334§14.7.4:

字符串连接:

string operator +(string x, string y);
string operator +(string x, object y);
string operator +(object x, string y);  
Run Code Online (Sandbox Code Playgroud)

+当一个或两个操作数是类型时,二元运算符执行字符串连接string.如果字符串连接的操作数是null,则替换空字符串.否则,通过调用ToString从类型继承的虚方法,将任何非字符串操作数转换为其字符串表示形式object.如果 ToString返回null,则替换空字符串.