87

查看string类元数据,我只看到运算符==!=重载。那么它是如何为 ' +' 运算符执行连接的呢?

编辑

Eric Lippert 关于字符串连接的一些有趣的注释:

第1部分

第2部分

第 2 部分中还提到了 Joel 的一篇超级文章 ( http://www.joelonsoftware.com/articles/fog0000000319.html )

4

1 回答 1

145

它没有 - C# 编译器会:)

所以这段代码:

string x = "hello";
string y = "there";
string z = "chaps";
string all = x + y + z;

实际上被编译为:

string x = "hello";
string y = "there";
string z = "chaps";
string all = string.Concat(x, y, z);

(Gah - 干预编辑意外删除了其他位。)

C# 编译器注意到这里有多个字符串连接的好处是,您最终不会创建一个中间字符串x + y,然后需要再次复制该中间字符串作为和的连接的(x + y)一部分z。相反,我们一口气完成了所有工作。

编辑:请注意,如果您在循环中连接,编译器无能为力。例如,这段代码:

string x = "";
foreach (string y in strings)
{
    x += y;
}

最终等同于:

string x = "";
foreach (string y in strings)
{
    x = string.Concat(x, y);
}

...所以这确实会产生很多垃圾,这就是为什么你应该StringBuilder在这种情况下使用 a 。我有一篇文章详细介绍了这两者,希望能回答更多问题。

于 2012-04-26T20:47:43.113 回答