2008-10-22 48 views

回答

89

您可以使用.ToString()StringBuilder得到String

8

使用StringBuilder完成處理後,使用ToString方法返回最終結果。

從MSDN:

using System; 
using System.Text; 

public sealed class App 
{ 
    static void Main() 
    { 
     // Create a StringBuilder that expects to hold 50 characters. 
     // Initialize the StringBuilder with "ABC". 
     StringBuilder sb = new StringBuilder("ABC", 50); 

     // Append three characters (D, E, and F) to the end of the StringBuilder. 
     sb.Append(new char[] { 'D', 'E', 'F' }); 

     // Append a format string to the end of the StringBuilder. 
     sb.AppendFormat("GHI{0}{1}", 'J', 'k'); 

     // Display the number of characters in the StringBuilder and its string. 
     Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString()); 

     // Insert a string at the beginning of the StringBuilder. 
     sb.Insert(0, "Alphabet: "); 

     // Replace all lowercase k's with uppercase K's. 
     sb.Replace('k', 'K'); 

     // Display the number of characters in the StringBuilder and its string. 
     Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString()); 
    } 
} 

// This code produces the following output. 
// 
// 11 chars: ABCDEFGHIJk 
// 21 chars: Alphabet: ABCDEFGHIJK 
3

我只想拋出這可能不一定更快,它肯定會有更好的內存佔用。這是因爲字符串在.NET中是不可變的,每次更改字符串時都會創建一個新字符串。

1

連接速度並不快 - 正如smaclell指出的那樣,問題是不可變的字符串強制對現有數據進行額外的分配和重新複製。

「一」 +「B」 +「c」是無更快與字符串生成器做的,但與中間的字符串越來越快作爲CONCAT年代#獲取重複concats像較大:

X = 「一個」; X + = 「B」; X + = 「C」; ...

1

關於它是更快/更好的內存:

我看着這個問題與Java,我認爲.NET是因爲聰明一點。

String的實現非常令人印象深刻。

String對象磁道「長度」和「共享」(獨立保持所述串陣列的長度的)

因此,像

String a = "abc" + "def" + "ghi"; 

可以被實現(由編譯器/運行時間)爲:

 
- Extend the array holding "abc" by 6 additional spaces. 
- Copy def in right after abc 
- copy ghi in after def. 
- give a pointer to the "abc" string to a 
- leave abc's length at 3, set a's length to 9 
- set the shared flag in both. 

由於大多數字符串都是短暫的,所以在很多情況下這會產生一些非常高效的代碼。 它絕對不是有效的情況是,當你在一個循環中添加一個字符串,或者當你的代碼是這樣的:

a = "abc"; 
a = a + "def"; 
a += "ghi"; 

在這種情況下,你是好得多使用StringBuilder的構造。

我的觀點是,無論何時優化,您都應該小心,除非絕對確定您知道自己在做什麼,並且您絕對確定這是必要的,並且您會測試以確保優化的代碼使用例通過,只需以最可讀的方式對其進行編碼,而不要試圖想出編譯器。

在查看字符串源代碼之前,我浪費了3天的時間與字符串混合,緩存/重用字符串構建器和測試速度,並發現編譯器已經做得比我的用例更好。然後,我必須解釋我是如何不知道自己在做什麼,我只以爲我做了...

11

當你說「串聯字符串與字符串生成器連接更快」時,只有當你是重複(我重複 - 重複)連接到同一個對象。

如果您只是串聯2個字符串並立即將結果做爲string,則使用StringBuilder沒有意義。

我只是無意中發現這個喬恩斯基特真好寫了起來:http://www.yoda.arachsys.com/csharp/stringbuilder.html

如果使用StringBuilder,然後拿到造成string,它只是一個調用ToString()(意料之中)的問題。

相關問題