什麼是 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
恢復正常的字串,我們可以簡單地呼叫 StringBuilder
的 ToString()
方法。
但是,這並不是 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
代替字串。