2011-03-31 100 views
4

爲什麼我會使用StringBuilder而不是簡單追加字符串?例如,爲什麼實現諸如:StringBuilder解決什麼問題?

StringBuilder sb = new StringBuilder; 
sb.Append("A string"); 
sb.Append("Another string"); 

String first = "A string"; 
first += "Another string"; 

+1

見http://www.yoda.arachsys.com/csharp/stringbuilder.html – 2011-03-31 11:12:27

+0

這是一個真正的內存使用效率(與性能優勢)追加大量字符串的方式在一起,無需花費很多的對象。 (更少的對象〜垃圾收集器所需的時間更少) – st0le 2011-03-31 11:13:59

+3

在循環之外,這不是什麼大問題,因爲編譯器可能會將其優化爲「String first =」一個字符串另一個字符串「;」一個字符串。其他人似乎已經說明了不要在循環中使用它的原因。 – BenCr 2011-03-31 11:15:51

回答

10

StringBuilder的文檔解釋其目的:

String對象是不可變的。每當您使用 System.String類中的某個方法時,您在內存中創建一個新的 字符串對象,其中 需要爲新對象 指定一個新的空間分配。在 您需要執行重複 修改字符串的情況下,與創建 新的String對象相關的 開銷可能是昂貴的。該 System.Text.StringBuilder類可用於 當你想修改字符串 而無需創建一個新的對象。對於 例如,使用StringBuilder類 可以提高性能時 在 一個循環中將許多字符串連接在一起。

5

在像你這樣的簡單情況下,它確實沒有關係。但通常情況下,字符串是不可變的,這意味着每次對字符串變量的更改都會在內存中創建一個新的緩衝區,複製新的數據並放棄舊的緩衝區。如果你正在做大量的字符串操作,這會減慢程序速度,並導致很多被遺棄的字符串緩衝區,這些緩衝區需要被垃圾收集器收集。

0

的StringBuilder是可變的。字符串不是。所以對字符串的任何操作都會創建一個新對象。在第二個示例中,創建了2個對象(每行一個)。而在第一個中,只有一個對象被創建。

+2

沒錯。但實際上,如果你不需要做大量的字符串操作,String和StringBuilder的性能幾乎相同,並且在短字符串和少量附加字符的情況下,簡單字符串的效果會更好。 – 2011-03-31 12:01:27