2012-04-26 33 views

回答

124

这不 - 的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); 

(尔加 - 介入编辑删除其他位意外。)

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这将有望回答更多的问题。

+8

好答案;只是一个后续问题:如果你在一个循环内串联字符串,当它不能预先知道循环中会发生什么时,编译器如何处理.Concat操作符。 – frenchie 2012-04-26 20:49:31

+0

@frenchie:将为此编辑。 – 2012-04-26 20:51:21

+0

好的!这就是为什么使用StringBuilder进行连接更好? – frenchie 2012-04-26 20:52:19