什麼是 StringBuilder 以及何時使用它

一個 StringBuilder 表示一系列字元,它不像普通的字串,是可變的。通常需要修改我們已經建立的字串,但標準字串物件不可變。這意味著每次修改字串時,都需要建立,複製並重新分配新的字串物件。

string myString = "Apples";
mystring += " are my favorite fruit";

在上面的例子中,myString 最初只有 Apples 的值。但是,當我們連線我最喜歡的水果時,字串類在內部需要做的是:

  • 建立一個新的字元陣列,等於 myString 的長度和我們要追加的新字串。
  • myString 的所有字元複製到新陣列的開頭,並將新字串複製到陣列的末尾。
  • 在記憶體中建立一個新的字串物件,並將其重新分配給 myString

對於單個串聯,這是相對微不足道的。但是,如果需要在迴圈中執行許多追加操作呢?

String myString = "";
for (int i = 0; i < 10000; i++)
    myString += " "; // puts 10,000 spaces into our string

由於反覆複製和建立物件,這將顯著降低程式的效能。我們可以通過使用 StringBuilder 來避免這種情況。

StringBuilder myStringBuilder = new StringBuilder();    
for (int i = 0; i < 10000; i++)
    myStringBuilder.Append(' ');

現在,當執行相同的迴圈時,程式執行時間的效能和速度將明顯快於使用普通字串。為了使 StringBuilder 恢復正常的字串,我們可以簡單地呼叫 StringBuilderToString() 方法。

但是,這並不是 StringBuilder 唯一的優化。為了進一步優化功能,我們可以利用其他有助於提高效能的屬性。

StringBuilder sb = new StringBuilder(10000); // initializes the capacity to 10000

如果我們事先知道 StringBuilder 需要多長時間,我們可以提前指定它的大小,這將阻止它需要調整它內部的字元陣列的大小。

sb.Append('k', 2000);

雖然使用 StringBuilder 進行追加比字串快得多,但如果你只需要多次新增單個字元,它可以執行得更快。

完成構建字串後,可以使用 StringBuilder 上的 ToString() 方法將其轉換為基本的 string。這通常是必要的,因為 StringBuilder 類不繼承 string

例如,以下是如何使用 StringBuilder 建立 string

string RepeatCharacterTimes(char character, int times)
{
    StringBuilder builder = new StringBuilder("");
    for (int counter = 0; counter < times; counter++)
    {
        //Append one instance of the character to the StringBuilder.
        builder.Append(character);
    }
    //Convert the result to string and return it.
    return builder.ToString();
}

總之,當需要對效能進行多次修改時,應使用 StringBuilder 代替字串。