TStringBuilder:高效字串建構器
TStringBuilder 是 Delphi 2009 引入的可變字串緩衝區,對應 .NET StringBuilder。核心優勢:避免不可變字串的頻繁分配/複製,適合大量拼接、修改場景。
建構函數重載
| 建構函數 | 參數 | 用途 |
Create | 無 | 空緩衝區,預設容量 16 字元 |
Create | Capacity: Integer | 指定初始容量 (字元數) |
Create | const Value: string | 以字串初始化 |
Create | const Value: string; Capacity: Integer | 字串初始化 + 指定容量 |
Create | Capacity, MaxCapacity: Integer | 指定初始/最大容量 |
完整實作程式碼
procedure TForm1.Button1Click(Sender: TObject); // 無參數建構 + 連續 Append
var sb: TStringBuilder;
begin
sb := TStringBuilder.Create;
try
sb.Append('Embarcadero');
sb.Append(' CodeGear');
sb.Append(' Delphi');
sb.Append(' 2009');
ShowMessage(sb.ToString); // 'Embarcadero CodeGear Delphi 2009'
finally sb.Free; end;
end;
procedure TForm1.Button2Click(Sender: TObject); // 字串初始化建構
var sb: TStringBuilder;
begin
sb := TStringBuilder.Create('Delphi ');
try
sb.Append(2009); // 整數直接追加
ShowMessage(sb.ToString); // 'Delphi 2009'
finally sb.Free; end;
end;
核心屬性與方法速查
| 成員 | 類型 | 說明 |
Length | 屬性 (讀寫) | 當前字元數。寫入 0 等同 Clear |
Capacity | 屬性 (讀寫) | 內部緩衝區配置容量。擴容時自動成長 (通常 2倍) |
MaxCapacity | 屬性 (唯讀) | 最大容量限制 (預設 2GB) |
Chars[Index] | 索引器 | 單字元讀寫 (0-based) |
Append | 方法 | 追加各類型值 (多重載) |
AppendLine | 方法 | 追加值 + 換行符 |
AppendFormat | 方法 | 格式化追加 |
Insert | 方法 | 指定位置插入 |
Remove | 方法 | 指定位置刪除 |
Replace | 方法 | 替換字元/字串 |
ToString | 方法 | 輸出字串 (可指定區間) |
Clear | 方法 | 清空內容 (Length:=0) |
EnsureCapacity | 方法 | 確保最小容量 |
CopyTo | 方法 | 複製區段到字元陣列 |
Equals | 方法 | 內容相等比較 |
基本使用模式
1. 簡單拼接 (替代 + 操作)
// 傳統: s := 'A' + 'B' + 'C'; // 多次分配
// TStringBuilder:
var sb := TStringBuilder.Create;
try
sb.Append('A').Append('B').Append('C'); // 鏈式呼叫
Result := sb.ToString;
finally sb.Free; end;
2. 迴圈大量拼接 (效能關鍵)
function JoinStrings(const Items: array of string; const Sep: string): string;
var
sb: TStringBuilder;
i: Integer;
begin
sb := TStringBuilder.Create(Length(Items) * 20); // 預估容量
try
for i := 0 to High(Items) do
begin
if i > 0 then sb.Append(Sep);
sb.Append(Items[i]);
end;
Result := sb.ToString;
finally sb.Free; end;
end;
3. 字串初始化建構
var sb := TStringBuilder.Create('Prefix_');
sb.Append(Suffix); // 直接在初始值基礎上擴展
4. 清空重用模式
var sb := TStringBuilder.Create(1000);
try
for batch in Batches do
begin
sb.Length := 0; // 保留容量,快速清空
BuildBatchString(sb, batch);
Process(sb.ToString);
end;
finally sb.Free; end;
效能對比:StringBuilder vs 字串拼接
| 場景 | String (+) | TStringBuilder | 優勢倍數 |
| 100 次拼接 | ~5000 字元複製 | ~1000 字元複製 | 5x |
| 1000 次拼接 | ~50萬字元複製 | ~1萬字元複製 | 50x |
| 10000 次拼接 | ~5000萬字元複製 | ~10萬字元複製 | 500x |
結論:迴圈/大量拼接必須用 TStringBuilder。
記憶體管理規則
TStringBuilder 是類別,需手動 Free
- 非介面型別,無參考計數,
sb2 := sb1 為參考複製,同一實例
try...finally Free 模式是標準用法
- 長期持有實例用
Length := 0 重用,避免反覆建構銷毀
常見新手錯誤與避坑
| 錯誤 | 後果 | 正確做法 |
| 忘記 Free | 記憶體洩漏 | 永遠用 try...finally |
| 以為 sb2 := sb1 是複製 | 修改 sb1 影響 sb2 | 需手動 sb2.Append(sb1.ToString) 複製內容 |
| Capacity 當 Length 用 | 邏輯錯誤 | Length = 實際字元數,Capacity = 配置緩衝區 |
| 小字串拼接也用 SB | 過度設計,可讀性下降 | 少量拼接用 + 或 Format 即可 |
進階:自訂初始容量策略
function EstimateCapacity(const Items: array of string; AvgLen: Integer = 10): Integer;
begin
Result := Length(Items) * (AvgLen + 2); // +2 for separator
if Result < 16 then Result := 16; // 最小容量
end;
var sb := TStringBuilder.Create(EstimateCapacity(Items));
總結
TStringBuilder.Create 提供靈活建構:無參數、指定容量、字串初始化。掌握Length/Capacity 雙屬性語意、Append 鏈式呼叫、迴圈預分配容量、Length:=0 重用、try...finally Free 五大核心模式,即能從入門到精通,將字串處理效能提升數十倍,構建高效能 Delphi 應用程式。