2012-04-26 35 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