C# 中 StringBuilder 類的作用是什麼?


在 C# 中,字串是不可變的。這意味著一旦建立了字串,就不能修改它。對字串的任何修改都會返回一個包含修改的新字串,而原始字串保持不變。

string word = "aaabbbccc";
string newWord = word.Replace('b', 'd');
Console.WriteLine(word); // prints aaabbbccc
Console.WriteLine(newWord); // prints aaadddccc

StringBuilder 類表示一個類似字串的物件,可以對其進行修改,即一個可變的字元序列。它的實現方式與 string 型別不同,string 型別表示一個不可變的字元序列。

由於修改字串物件會建立副本,因此重複修改字串物件可能會導致效能下降。對於少量重複,這是可以忽略不計的,但對於大型迴圈,則可能非常顯著。StringBuilder 提供了一種高效的替代方案來修改字串,方法是追加、刪除、替換或插入字元。

StringBuilder 保持一個內部緩衝區來儲存字元。如果緩衝區中有可用空間,它會追加新資料。否則,它會建立一個新的緩衝區,將舊資料複製到新緩衝區,然後追加資料。

var sb = new StringBuilder();
for (int i = 0; i < 10; i++){
   sb.Append("a");
}
Console.WriteLine(sb.ToString()); // prints aaaaaaaaaa

以下是構造 StringBuilder 物件的不同方法。

// Initialize a new instance of StringBuilder
var sb1 = new StringBuilder();

// Initialize a new instance of StringBuilder using the given capacity
var sb2 = new StringBuilder(capacity: 10);

// Initialize a new instance of StringBuilder with the given string
var sb3 = new StringBuilder(value: "Hello World");

// Initialize a new instance of StringBuilder with the given capacity and the maximum capacity it can grow to
var sb4 = new StringBuilder(capacity: 20, maxCapacity: 10);

// Initialize a new instance of StringBuilder with the given string and capacity
var sb5 = new StringBuilder(value: "Hello", capacity: 20);

// Initialize a new instance of StringBuilder from the given substring and capacity
var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20);

StringBuilder 類有一個 Length 屬性,指示該物件當前包含的字元數。向物件新增更多字元後,其長度會增加,直到達到其容量,容量定義了物件當前可以包含的最大字元數。

如果新增的字元數量導致長度超過其當前容量,則該類會分配新的記憶體,並增加其容量。然後將新字元新增到物件中,並調整其 Length 屬性。

StringBuilder 會動態地不斷新增額外的記憶體,直到達到 MaxCapacity 屬性的值。之後,無法再為該物件分配記憶體。如果嘗試向物件新增更多資料,它將丟擲 ArgumentOutOfRangeExceptionOutOfMemoryException 異常。

StringBuilder 提供了以下方法,使修改字串變得容易。

  • Append − 將指定物件的字串表示形式追加到此例項。

  • AppendFormat − 將處理複合格式字串(包含零個或多個格式項)返回的字串追加到此例項。每個格式項都將替換為相應物件引數的字串表示形式。

  • AppendJoin − 使用指定的分隔符連線提供的物件陣列中元素的字串表示形式,然後將結果追加到字串生成器的當前例項。

  • AppendLine − 將預設行終止符追加到當前 StringBuilder 物件的末尾。

  • Clear − 從當前 StringBuilder 例項中刪除所有字元。

  • CopyTo − 將字元複製到目標 char span 或 char 陣列。

  • EnsureCapacity − 確保此 StringBuilder 例項的容量至少為指定值。

  • Equals − 如果此例項和提供的例項具有相同的字串、Capacity 和 MaxCapacity 值,則返回 true。

  • GetChunks − 返回一個可用於迭代字元塊的物件。

  • Insert − 在指定字元位置將指定物件的字串表示形式插入此例項。

  • Remove − 從此例項中刪除指定的字元範圍。

  • Replace − 將此例項中指定字元或字串的所有出現替換為另一個指定的字元或字串。

  • ToString − 將當前例項轉換為字串。

示例

 線上演示

using System;
using System.Text;
class Program{
   static void Main(string[] args){
      string word = "aaabbbccc";
      string newWord = word.Replace('b', 'd');
      Console.WriteLine(word); // prints aaabbbccc
      Console.WriteLine(newWord); // prints aaadddccc
      var sb = new StringBuilder();
      for (int i = 0; i < 10; i++){
         sb.Append("a");
      }
      Console.WriteLine(sb.ToString()); // prints aaaaaaaaaa

      // Initialize a new instance of StringBuilder
      var sb1 = new StringBuilder();

      // Initialize a new instance of StringBuilder using the given capacity
      var sb2 = new StringBuilder(capacity: 10);
     
      // Initialize a new instance of StringBuilder with the given string
      var sb3 = new StringBuilder(value: "Hello World");
      // Initialize a new instance of StringBuilder with the given capacity and the    maximum capacity it can grow to
      var sb4 = new StringBuilder(capacity: 20, maxCapacity: 50);
      // Initialize a new instance of StringBuilder with the given string and capacity
      var sb5 = new StringBuilder(value: "Hello", capacity: 20);

      // Initialize a new instance of StringBuilder from the given substring and capacity
      var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20);
   }
}

輸出

aaabbbccc
aaadddccc
aaaaaaaaaa

更新於: 2021-05-19

379 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.