2010-11-16 36 views

回答

15

簡答題:StringBuilder適用於連接任意數量的字符串的情況,這些字符串在編譯時並不知道。

如果知道你在編譯的時候結合了哪些字符串,StringBuilder基本上是沒有意義的,你不需要它的動態調整能力。

示例1:您想結合「貓」,「狗」和「鼠標」。這正好是11個字符。你可以簡單地分配長度爲11的char[]數組,並用來自這些字符串的字符填充它。這實質上是string.Concat所做的。

示例2:您想要將未指定數量的用戶提供的字符串合併爲一個字符串。由於要提前並置的數據量未知,因此在這種情況下使用StringBuilder即可。

16

StringBuilder的是不是一定會更快。我記得,如果你連接少於十幾個字符串,字符串concatentation(其他的通過String.Concat或簡單的str1 + str2)實際上更快。原因是StringBuilder的分配和初始化實際上需要時間。

StringBuilder更快的原因是它創建了一個內部緩衝區,它添加了字符串。如果連接了20個字符串,StringBuilder只是將一個接一個地附加到緩衝區,最後在請求時通過其ToString()方法返回結果。 (我假設有足夠的緩衝區空間,否則StringBuilder會擔心重新分配緩衝區,並且有幫助它不要重新分配太多時間的啓發法。)如果你是字符串聯合,每個字符串concat會分配一個新的字符串長度(str1.Length + str2.Length)並將第一個和第二個字符串複製到位。這導致了很多字符串的重新複製。

var result = str1 + str2 + str3 + ... + strN; 

這將需要N-1個分配和N-1個複製操作。這對於大N來說可能非常昂貴。另外請注意,您正在複製str1的內容N-1次。一次得到str1 + str2的結果。然後再次得到(str1 + str2)+ str3的結果。使用StringBuilder,每個字符串只會複製到內部緩衝區一次,假設緩衝區足夠大以容納單個字符串。

+5

我相信你的結尾段落的前幾句話是不正確的。以這種方式連接許多字符串的單行將會,除非我錯誤,編譯爲一個'string.Concat'調用,它爲結果字符串分配足夠的空間一次,而不需要按照您的建議執行多次重新分配。 – 2010-11-16 04:11:07

+0

C#編譯器可能會有這種優化。我沒有檢查過。通常情況下,這些類型的連接是在for循環中完成的,不能被優化。 C#編譯器針對您將一系列常量字符串進行連接的情況進行優化,這會導致編譯器發出單個常量字符串並完全避免運行時連接。 – 2010-11-16 04:16:10

相關問題