2014-03-01 155 views
2

告訴我這個代碼C#有什麼問題。加入字符串字段

 string str = string.Empty; 
     for (var i = 1; i <= 1000; i++) 
      str += i.ToString(); 

這是面試問題。

+0

沒有問題。這取決於你想要做什麼。 – kiks73

+1

這可能會導致內存消耗問題,這裏+運算符創建1000個字符串,在這種情況下使用'StringBuilder'。 – Coder

回答

5

居然有你的代碼沒有問題。

在這種情況下StringBuilderstring更合適。

因爲StringBuilder是可變的,而stringimmutable

所以無論何時使用+=修改字符串對象,它都會創建一個新的string對象,因此在循環結束時會創建許多字符串對象。

但是如果您使用StringBuilder:每次將Strings附加到它時,都會修改相同的對象。

您可以從MSDN找到更多的信息:StringBuilder Class

String對象是不可改變的。每次使用System.String類中的方法 之一時,都會在內存中創建一個新的字符串對象, 需要爲該新對象重新分配空間。在 需要重複修改 字符串的情況下,與創建新String對象相關的開銷可能會很高。當您想要在不創建新對象的情況下修改字符串時,可以使用System.Text.StringBuilder類。例如,使用StringBuilder類的 可以在循環中連接多個字符串時提高性能。

解決方案:

string str = string.Empty; 
    for (var i = 1; i <= 1000; i++) 
     str += i.ToString(); 

shouldBe這樣這個

StringBuilder str =new StringBuilder(); 
    for (var i = 1; i <= 1000; i++) 
     str.Append(i.ToString()); 
+0

感謝您的解釋 – AleksP

1

有一個答案here

the compiler can't do anything if you concatenate in a loop and this does generate a lot of garbage.