在 .NET 中使用 StringBuilder 類別

String 物件不可變。 每次您使用 System.String 類別的其中一個方法時,就會在記憶體中建立新的字串物件,這需要為該新物件配置新的空間。 在您需要重複修改字串的情況下,與建立新 String 物件相關聯的額外負荷可能成本高昂。 當您想要修改字串,而不建立新物件時,可以使用 System.Text.StringBuilder 類別。 例如,在迴圈中將許多字串串連在一起時,可以使用 StringBuilder 類別來提升效能。

匯入 System.Text 命名空間

StringBuilder 類別位於 System.Text 命名空間。 為了避免在程式碼中提供完整的類型名稱,您可以匯入 System.Text 命名空間:

using namespace System;
using namespace System::Text;
using System;
using System.Text;
Imports System.Text

具現化 StringBuilder 物件

您可以使用其中一個多載建構函式方法來將變數初始化,以建立 StringBuilder 類別的新執行個體,如下列範例所示。

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
Dim myStringBuilder As New StringBuilder("Hello World!")

設定容量和長度

雖然 StringBuilder 是一個動態物件,可讓您擴充其封裝之字串中的字元數,但您可以指定它能容納的字元數上限值。 這個值稱為物件的容量,不應該與目前 StringBuilder 保存的字串長度混淆。 例如,您可以用字串 "Hello" 建立 StringBuilder 類別的新執行個體,其長度為 5,而您可能會將物件的最大容量指定為 25。 當您修改 StringBuilder 時,在到達容量上限之前,它不會重新配置自己的大小。 發生這種情況時,會自動配置新的空間,而且容量加倍。 您可以使用其中一個多載建構函式來指定 StringBuilder 類別的容量。 下列範例會指定 myStringBuilder 物件可以擴展到最多 25 個空格。

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!", 25);
StringBuilder myStringBuilder = new StringBuilder("Hello World!", 25);
Dim myStringBuilder As New StringBuilder("Hello World!", 25)

此外,您可以使用讀/寫 Capacity 屬性來設定物件的長度上限。 下列範例會使用 Capacity 屬性來定義物件長度上限。

myStringBuilder->Capacity = 25;
myStringBuilder.Capacity = 25;
myStringBuilder.Capacity = 25

EnsureCapacity 方法可用來檢查目前 StringBuilder 的容量。 如果容量大於傳遞的值,不會進行任何變更。不過,如果容量小於傳遞的值,會變更目前的容量以符合傳遞的值。

也可以檢視或設定 Length 屬性。 如果您將 Length 屬性的值設成大於 Capacity 屬性的值,則 Capacity 屬性會自動變更為與 Length 屬性相同的值。 若將 Length 屬性的值設成小於目前 StringBuilder 內字串長度的值,則會縮短該字串。

修改 StringBuilder 字串

下表列出您可用來修改 StringBuilder 內容的方法。

方法名稱 使用
StringBuilder.Append 將資訊附加至目前 StringBuilder 的結尾。
StringBuilder.AppendFormat 將字串中傳遞的格式規範取代為格式化的文字。
StringBuilder.Insert 將字串或物件插入目前 StringBuilder 的指定索引。
StringBuilder.Remove 從目前 StringBuilder 移除指定的字元數。
StringBuilder.Replace 以另一個指定的字元或字串,取代目前 StringBuilder 中指定的字元或字串的所有項目。

附加

Append 方法可以用來將物件的文字或字串表示加入至目前 StringBuilder 所代表的字串結尾。 下列範例會將 StringBuilder 初始化為 "Hello World",然後附加一些文字到物件的結尾。 會視需要自動配置空格。

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
myStringBuilder->Append(" What a beautiful day.");
Console::WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello World! What a beautiful day.
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Append(" What a beautiful day.");
Console.WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello World! What a beautiful day.
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Append(" What a beautiful day.")
Console.WriteLine(myStringBuilder)
' The example displays the following output:
'       Hello World! What a beautiful day.

AppendFormat

StringBuilder.AppendFormat 方法會將文字加入至 StringBuilder 物件的結尾。 它藉由呼叫要格式化之一或多個物件的 IFormattable 實作,來支援複合格式功能 (如需詳細資訊,請參閱複合格式)。 因此,它接受數值、日期和時間,以及列舉值的標準格式字串,數值及日期和時間的自訂格式字串,以及為自訂類型定義的格式字串。 (如需格式設定的資訊,請參閱格式化類型。)您可以使用這個方法來自訂變數格式,並將那些值附加到 StringBuilder。 下列範例使用 AppendFormat 方法,將格式化為貨幣值的整數值放到 StringBuilder 物件的結尾。

int MyInt = 25;
StringBuilder^ myStringBuilder = gcnew StringBuilder("Your total is ");
myStringBuilder->AppendFormat("{0:C} ", MyInt);
Console::WriteLine(myStringBuilder);
// The example displays the following output:
//       Your total is $25.00
int MyInt = 25;
StringBuilder myStringBuilder = new StringBuilder("Your total is ");
myStringBuilder.AppendFormat("{0:C} ", MyInt);
Console.WriteLine(myStringBuilder);
// The example displays the following output:
//       Your total is $25.00
Dim MyInt As Integer = 25
Dim myStringBuilder As New StringBuilder("Your total is ")
myStringBuilder.AppendFormat("{0:C} ", MyInt)
Console.WriteLine(myStringBuilder)
' The example displays the following output:
'     Your total is $25.00  

插入​​

Insert 方法會將字串或物件加入至目前 StringBuilder 物件中的指定位置。 下列範例會使用這個方法,在 StringBuilder 物件的第六個位置插入一個字組。

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
myStringBuilder->Insert(6,"Beautiful ");
Console::WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello Beautiful World!
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Insert(6,"Beautiful ");
Console.WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello Beautiful World!
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Insert(6, "Beautiful ")
Console.WriteLine(myStringBuilder)
' The example displays the following output:
'      Hello Beautiful World!

移除

您可以使用 Remove 方法,從目前 StringBuilder 物件移除指定的字元數 (從指定之以零為基礎的索引開始)。 下列範例會使用 Remove 方法來縮短 StringBuilder 物件。

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
myStringBuilder->Remove(5,7);
Console::WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Remove(5,7);
Console.WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Remove(5, 7)
Console.WriteLine(myStringBuilder)
' The example displays the following output:
'       Hello

Replace

Replace 方法可以用來將 StringBuilder 物件內的字元取代為另一個指定的字元。 下列範例會使用 Replace 方法,來搜尋 StringBuilder 物件中所有的驚嘆號字元 (!) 執行個體,並取代為問號字元 (?)。

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
myStringBuilder->Replace('!', '?');
Console::WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello World?
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Replace('!', '?');
Console.WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello World?
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Replace("!"c, "?"c)
Console.WriteLine(myStringBuilder)
' The example displays the following output:
'       Hello World?

將 StringBuilder 物件轉換為字串

您必須先將 StringBuilder 物件轉換成 String 物件,才能將 StringBuilder 物件所代表的字串傳遞給具有 String 參數的方法,或在使用者介面中加以顯示。 您可以呼叫 StringBuilder.ToString 方法來執行這項轉換。 下列範例會呼叫一些 StringBuilder 方法,然後呼叫 StringBuilder.ToString() 方法來顯示字串。

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      StringBuilder sb = new StringBuilder();
      bool flag = true;
      string[] spellings = { "recieve", "receeve", "receive" };
      sb.AppendFormat("Which of the following spellings is {0}:", flag);
      sb.AppendLine();
      for (int ctr = 0; ctr <= spellings.GetUpperBound(0); ctr++) {
         sb.AppendFormat("   {0}. {1}", ctr, spellings[ctr]);
         sb.AppendLine();
      }
      sb.AppendLine();
      Console.WriteLine(sb.ToString());
   }
}
// The example displays the following output:
//       Which of the following spellings is True:
//          0. recieve
//          1. receeve
//          2. receive
Imports System.Text

Module Example
    Public Sub Main()
        Dim sb As New StringBuilder()
        Dim flag As Boolean = True
        Dim spellings() As String = {"recieve", "receeve", "receive"}
        sb.AppendFormat("Which of the following spellings is {0}:", flag)
        sb.AppendLine()
        For ctr As Integer = 0 To spellings.GetUpperBound(0)
            sb.AppendFormat("   {0}. {1}", ctr, spellings(ctr))
            sb.AppendLine()
        Next
        sb.AppendLine()
        Console.WriteLine(sb.ToString())
    End Sub
End Module
' The example displays the following output:
'       Which of the following spellings is True:
'          0. recieve
'          1. receeve
'          2. receive

另請參閱