2011-07-28 32 views
0

「...如果連接固定數量的String對象,則String類更適合於連接操作。在這種情況下,單獨的連接操作甚至可以組合成單個操作編譯器。固定數量的.NET字符串連接

一個StringBuilder對象是最好的結合動作,如果字符串任意數量的被連接起來......」

http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

件事,讓我是不確定的話‘甚至可能是’在第一段。它不應該「肯定會」嗎?因爲如果沒有將連接組合成一個操作,String的重複內存分配將使其與StringBuilder相比絕對劣勢。

回答

2

那麼,它也可能沒有明顯的區別。說實話,他們會因爲瑣碎的連接而離得很近,但是:對於一個操作中的「n」個字符串的直接連接,Concat(aka +)會發光;長度等可以有效地計算出來,然後就是複製。在一個循環中,StringBuilder將發光。

當你的毗連在一個操作

string s = a + b + c + x + y + z; 

這是真的:

string s = string.Concat(a, b, c, x, y, z); 

這是唯一一個額外的字符串。

+0

因此,是否使用變量或硬編碼文字並不重要,對嗎?只要連接在一行代碼中,它們將被合併? –

+0

@SValmont - one *表達*(不是一行),是的。請注意,如果*文字或常量*相鄰,編譯器將在構建時執行它(不是在運行時)。 –

+0

接受6個參數的Concat()沒有超載。 –

0

這就是說,如果字符串的長度可以在編譯時確定,編譯器會自動將它合併爲一個更高效的表示形式。但是,如果在編譯時無法計算長度,則應使用StringBuilder。

「甚至可能」是如果您只連接兩個不確定長度的字符串,使用String可能會更快。串聯的字符串越多,StringBuilder的好處就越多。

0

我的猜測是你可以用編譯器不會將它合併成一個的方式編寫代碼。但是,如果您按照微軟希望的方式編寫代碼,則應該在一次操作中完成。