使用'+'运算符的字符串连接


Answers:


143

它不是-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)and串联的一部分再次复制z。相反,我们一次性完成了所有工作。

编辑:请注意,如果您在循环中串联,编译器将无法执行任何操作。例如,此代码:

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

最终等同于:

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

...因此确实会产生大量垃圾,这就是为什么StringBuilder在这种情况下应使用a的原因。我有一篇文章将详细介绍这两者,希望能回答更多问题。


8
好答案; 只是一个后续问题:如果您要在循环内连接字符串,那么当编译器无法事先知道循环中将发生什么时,编译器如何工作.Concat运算符。
frenchie 2012年

喔好吧!这就是为什么最好使用StringBuilder进行串联的原因?
frenchie 2012年

4
@frenchie:这就是为什么最好使用StringBuilder进行重复串联……但是为什么不建议将它固定数目的值串联。
乔恩·斯基特

@ Jon-Skeet:感谢您的快速澄清...我也应该在IL中进行检查..这也是int的添加方式?通过调用Add方法?
NoviceProgrammer 2012年

2
但是请注意,如今string.Concatstring.Join方法有许多重载,包括某些IEnumerable<>实例的重载。因此,在大多数情况下使用它们比使用a更方便StringBuilder(我不知道这些方法是否在StringBuilder内部使用,我只是说它们在大多数情况下更方便)。
Jeppe Stig Nielsen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.