【发布时间】:2012-05-07 15:27:47
【问题描述】:
查看string 类元数据,我只看到运算符== 和!= 重载。那么它是如何为 '+' 运算符执行连接的呢?
编辑:
Eric Lippert 关于字符串连接的一些有趣笔记:
第 2 部分中还提到了 Joel 的一篇超级文章 (http://www.joelonsoftware.com/articles/fog0000000319.html)
【问题讨论】:
查看string 类元数据,我只看到运算符== 和!= 重载。那么它是如何为 '+' 运算符执行连接的呢?
编辑:
Eric Lippert 关于字符串连接的一些有趣笔记:
第 2 部分中还提到了 Joel 的一篇超级文章 (http://www.joelonsoftware.com/articles/fog0000000319.html)
【问题讨论】:
它没有 - 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。我有一个article going into more details about the two,希望能回答更多问题。
【讨论】:
string.Concat 和string.Join 方法有许多重载,包括一些采用IEnumerable<> 实例。所以在大多数情况下,它们比使用StringBuilder更方便(我不知道这些方法内部是否使用StringBuilder,我只是说它们在大多数情况下更方便)。