c# - 追加到空字符串在 C# 中如何工作?

标签 c# .net string null

我很惊讶地看到一个字符串被初始化为 null 然后在生产环境中附加了一些东西的例子。只是闻起来不对。

我确信它会抛出空对象异常,但这个大大简化的示例也有效:

string sample = null;
sample += "test";
// sample equals "test"

*请注意,我发现的原始代码将一个字符串属性设置为 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;
}

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

最佳答案

字符串的 + 运算符只是 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);
}

关于c# - 追加到空字符串在 C# 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7953492/

相关文章:

c# - SQL登录系统

c# - 使一种类型适应另一种类型的最佳 OO 实践?

c# - SqlConnection 状态总是在执行时关闭

.net - Azure:Function App Cosmosdb触发本地开发

c - 数组元素作为不同数组的索引

c# - C#中的二维数组

c# - .NET/C# - 将 char[] 转换为字符串

c# - 如何从基类型中声明的方法返回派生类型

Java:分割逗号分隔的字符串但忽略引号中的逗号

javascript - 选择函数的子集作为字符串并评估