告訴我這個代碼C#有什麼問題。加入字符串字段
string str = string.Empty;
for (var i = 1; i <= 1000; i++)
str += i.ToString();
這是面試問題。
告訴我這個代碼C#有什麼問題。加入字符串字段
string str = string.Empty;
for (var i = 1; i <= 1000; i++)
str += i.ToString();
這是面試問題。
居然有你的代碼沒有問題。
在這種情況下StringBuilder
比string
更合適。
因爲StringBuilder
是可變的,而string
是immutable
。
所以無論何時使用+=
修改字符串對象,它都會創建一個新的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());
感謝您的解釋 – AleksP
有一個答案here。
the compiler can't do anything if you concatenate in a loop and this does generate a lot of garbage.
沒有問題。這取決於你想要做什麼。 – kiks73
這可能會導致內存消耗問題,這裏+運算符創建1000個字符串,在這種情況下使用'StringBuilder'。 – Coder