Home [C# 筆記] StringBuilder 類別
Post
Cancel

[C# 筆記] StringBuilder 類別

StringBuilder 類別

StringBuilder 表示可變動的字元字串。 此類別無法獲得繼承。

System.Text.StringBuilder類別主要功能是用來「管理字串」,包括:附加、移除、取代或插入字串等。

StringBuilder 和 string 比較表

 StringBuilder 物件String 物件
串連作業配置記憶體緩衝區太小無法容納新資料才配置。永遠配置新記憶體。
串連作業適合未知數目的動態串連。適合固定數目的串連。
字串管理功能專注於字串的附加、移除、取代、插入等。提供較多的方法來操作運算字串。
  例如:分割字串、搜尋字串、去空白、轉大小寫等。

StringBuilder會維護一個緩衝區,以容納新資料。
string 是參考型別,所以每次在動態處理資料時,都會再配置一個新的記憶體給它,但是原本使用的資源雖然最終交由 GC(Garbage Collection) 回收,但是在回收之前資源卻已經浪費掉了。

C# 中 String 直接累加與 StringBuilder

StringBuilder 常用屬性

屬性名稱功能說明
Chars用來取得 StringBuilder 物件中指定的位置的字元。(取出索引位置字元)
Length用來取得 StringBuilder 物件的字元總數。(計算長度)
Capacity用來取得 StringBuilder 物件的目前容量。
MaxCapacity用來取得 StringBuilder 物件的最大容量。

範例

1
2
3
4
5
StringBuilder sb = new StringBuilder("I Love C#.");
Console.WriteLine(sb[2]); // L,取出索引2位置 字元
Console.WriteLine(sb.Length); // 長度: 10
Console.WriteLine(sb.Capacity); //目前容量: 16
Console.WriteLine(sb.MaxCapacity); //最大容量: 2147483647

StringBuilder 常用方法

方法名稱功能說明
Append()將指定物件的字串,附加於目前 StringBuilder 字串的末端。
AppendFormat()將指定格式化的字串,附加於目前 StringBuilder 字串的末端。
AppendLine()換行。加入換行字元
EnsureCapacity()指定目前 StringBuilder 字串容量。
Insert()在指定的索引位置上,插入字串。(指定插入的位置)
Remove()移除指定的字元範圍。Remove(2,3)索引2 位置 開始移除 3個字元
Replace()取代字元。Replace("要換的字", "取代的字")
ToString()將 StringBuilder 物件轉換成 String物件

Apend()Insert()的區別是:
Apend() 始終加到最後,Insert()可以指定插入的位置。

Append()

1
2
3
4
// Append 附加文字
StringBuilder sb = new StringBuilder("I Love C#.");
sb.Append("您好");
Console.WriteLine(sb.ToString()); //I Love C#.您好

AppendFormat()

1
2
3
4
5
// AppendFormat 格式化的字串
double n = 14000;
StringBuilder sb = new StringBuilder("NB價格:");
sb.AppendFormat("{0:C}", n);
Console.WriteLine(sb.ToString()); //NB價格:NT$14,000.00

AppendLine()

1
2
3
4
5
// AppendLine 換行
StringBuilder sb = new StringBuilder("Come what may!");
sb.AppendLine(); //加入換行字元
sb.Append("I'm making an all-out effort.");
Console.WriteLine(sb.ToString());

EnsureCapacity()

1
2
3
// EnsureCapacity 指定容量
sb.EnsureCapacity(50); //指定目前 StringBuilder 字串容量
Console.WriteLine(sb.Capacity); //目前容量

Insert()

1
2
3
4
// Insert 在指定的索引位置上,插入字串。
StringBuilder sb = new StringBuilder("張三李四王五");
sb.Insert(1, 123); //張123三李四王五
Console.WriteLine(sb.ToString());

Remove()

1
2
3
4
// Remove 移除
StringBuilder sb = new StringBuilder("張三五");
sb.Remove(1, 1); //張五,索引1 位置 開始移除 1個字元
Console.WriteLine(sb.ToString());

Replace()

1
2
3
4
// Replace 取代字元
StringBuilder sb = new StringBuilder("張三五");
sb.Replace("三", "小"); //張小五
Console.WriteLine(sb.ToString());

範例:文字字串對齊格式化

1
2
3
4
5
StringBuilder sb = new StringBuilder();
sb.AppendFormat("[{0,-5}]",80);
sb.AppendLine(); //換行
sb.AppendFormat("[{0,5}]",99);
Console.WriteLine(sb.ToString());

執行結果:

1
2
[80   ]
[   99]

string 和 StringBuilder 的差別

string 為什麼這麼慢?
因為他要在內存開空間。

StringBuilder因為沒有開空間,所以特別快。


string 是不可變的。

(都會分配新的內存空間)

一旦創建了一個 string 對象,它的值就不能被修改。如果對其進行操作,將會生成一個新的 string 對象。 (一旦創建了一個字串對象,就不能更改其內容。對字串進行修改實際上是建立一個新的字串物件。)

string 是不可變的,所以每次對 string 執行操作(例如連接、分割、替換等),都會分配新的內存空間,這可能導致內存碎片化和性能下降。

StringBuilder 是可變的。

(內容可以在緩衝區內進行修改,而無需分配新的內存空間。)

StringBuilder 是用於處理可變字串的類型,它允許動態修改其內容而不創建新的對象。這對於大量字串操作很有用,因為它避免了不斷創建新的 string 對象,從而提高了性能。 (它允許對字串進行動態的、原地的修改,而不必每次都建立新的物件。)

StringBuilder 類型的對象具有內部緩衝區,用於儲存和修改字串的內容。當進行字串操作時,內容可以在緩衝區內進行修改,而無需分配新的內存空間。

String

string 只要對它有任何的操作,就會在內存(記憶體空間)當中開闢一塊新的空間。
stringReferenceType(參考類型)。

  • 當你給字串賦值的時候,舊的資料並不會銷毀,而是在Heap(堆積)重新開闢一塊空間儲存新值,同時也產生很多內存垃圾。(所以,字串一旦聲明了就不再可以改變。)

  • 當程式結束後,GC掃描整個內存,如果發現有的空間沒有被指向,則立即把它銷銷。
  • 可以對它理解,每對string重新賦值,加一個字元,減一個字元…等等,每一個任何操作,只要操作一次,就會在內存當中開闢一塊新的空間。

參考類型(ReferenceType): 裝箱(Boxing) & 拆箱(Unboxing)

  • Boxing(裝箱): 將堆疊(stack)中的值複製到堆積(heap)中的行為,就叫 Boxing(裝箱)。

  • Unboxing(拆箱): 反過來說,將堆積(heap)中的值,複製到堆疊(stack)中的行為,就叫 Unboxing(拆箱)。

實值型別 & 參考型別

  • ValueType (實值型別) 是直接將值儲存於 Stack,複製時也會完整複製,修改時互相不影響。
  • ReferenceType (實值型別) 是將參考位址存放於 Stack,資料則是存放於 Heap,複製時只會將位置進行複製,但還是指向同一份資料,修改時互相受影響。

MSDN - StringBuilder 類別
[C# 筆記] string 不可變的特性 by R
[C# 筆記] 高效的 StringBuilder by R
[C# 筆記] string 和 StringBuilder 運行時間比較 by R
[C# 筆記] string 和 StringBuilder 的區別,兩者表現的比較
Book: Visual C# 2005 建構資訊系統實戰經典教本

This post is licensed under CC BY 4.0 by the author.