首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 字串處理核心:String vs StringBuilder 完整指南與效能抉擇

     編輯:關於C#

String 不可變本質


string s = "Hello";
s += " World"; // 實際發生:
// 1. 配置新字串 (11 chars)
// 2. 複製 "Hello"
// 3. 複製 " World"
// 4. s 指向新字串,舊字串等待 GC

每次修改都**配置新記憶體、複製內容**,大量串接會產生大量暫時物件,觸發 Gen 0/1 GC,嚴重影響效能。

StringBuilder 可變緩衝區


var sb = new StringBuilder("Hello", 100); // 初始容量 100
sb.Append(" World");        // 在緩衝區尾端寫入,不配置新物件
sb.AppendLine("!");
sb.Replace("World", "C#");  // 原地取代
string result = sb.ToString(); // 最後一次性轉為 String

核心 API 對照表

操作StringStringBuilder
連接+ / Concat / JoinAppend / AppendLine / AppendFormat
插入Insert (回傳新字串)Insert(index, value) (原地)
移除Remove / SubstringRemove(start, length)
取代Replace(old, new)Replace(old, new)
查詢IndexOf, Contains, StartsWithToString().IndexOf... (需轉字串)
大小寫ToUpper/ToLower無 (需轉字串處理)
格式化string.Format / $""AppendFormat

效能基準測試 (10 萬次串接)


// String: ~1200 ms, Gen0 GC 200+ 次
string s = "";
for (int i = 0; i < 100000; i++) s += "x";

// StringBuilder: ~5 ms, Gen0 GC 0 次
var sb = new StringBuilder(100000);
for (int i = 0; i < 100000; i++) sb.Append('x');

差距 > 200 倍,GC 壓力歸零。

何時用哪個?決策樹

  1. **已知固定次數/簡單格式化** → string.Concat / $"" / string.Join (編譯器優化單次配置)。
  2. **迴圈、遞迴、動態次數、大量修改** → StringBuilder (指定預估容量避免擴容)。
  3. **需大量查詢/比較/大小寫** → String (API 豐富、不可變安全)。
  4. **高效能/零配置** → Span + StringBuilder / String.Create (進階)。

StringBuilder 容量管理

  • Capacity:目前緩衝區大小 (可手動設定,擴容通常雙倍)。
  • Length:實際字元數。
  • MaxCapacity:上限 (預設 int.MaxValue),可限制防止惡意/錯誤耗盡記憶體。
  • 建構子 new StringBuilder(initCapacity) 避免多次擴容複製。

進階:String.Create 配合 Span (NET Core 2.1+)


// 零配置格式化範例:產生 "Item_0001" ~ "Item_9999"
string[] items = new string[10000];
for (int i = 0; i < 10000; i++)
{
    items[i] = string.Create(10, i, (span, value) =>
    {
        "Item_".AsSpan().CopyTo(span);
        // 手寫 4 位數字格式化
        int v = value;
        span[9] = (char)('0' + v % 10); v /= 10;
        span[8] = (char)('0' + v % 10); v /= 10;
        span[7] = (char)('0' + v % 10); v /= 10;
        span[6] = (char)('0' + v % 10);
    });
}

極致效能場景 (高頻日誌、序列化) 可考慮。

總結

String = 不可變、語意安全、API 豐富,適合大多數業務邏輯。
StringBuilder = 可變緩衝區、批次修改零配置,專為**大量串接/修改**設計。
掌握兩者邊界,善用 `string.Join`、`String.Create` 等現代 API,即可寫出兼具可讀性與高效能的字串處理程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved