TStringBuilder 的 ToString 方法提供兩種重載,支援完整輸出與區間擷取,避免建立中間字串副本,提升效能。
| 方法 | 參數 | 回傳 | 說明 |
|---|---|---|---|
ToString | 無 | string | 輸出完整緩衝區內容 |
ToString | StartIndex, Length: Integer | string | 擷取指定範圍子字串 (0-based) |
procedure TForm1.Button1Click(Sender: TObject);
var
sb: TStringBuilder;
begin
sb := TStringBuilder.Create('123456789');
try
ShowMessage(sb.ToString); // '123456789' - 完整輸出
ShowMessage(sb.ToString(3, 4)); // '4567' - 從索引 3 取 4 字元
finally
sb.Free;
end;
end;
0 代表第一個字元'123456789'.ToString(3, 4) → 索引 3='4',取 4 個 → '4567'EArgumentOutOfRangeException
// 傳統字串操作:每次操作產生新字串
var s: string;
s := '123456789';
s := Copy(s, 4, 4); // 產生新字串 '4567'
// TStringBuilder:同一緩衝區直接擷取
var sb: TStringBuilder;
sb := TStringBuilder.Create('123456789');
var sub := sb.ToString(3, 4); // 直接從緩衝區複製,無額外建構器分配
procedure ProcessLargeText(const Input: string);
var
sb: TStringBuilder;
chunk: string;
i: Integer;
begin
sb := TStringBuilder.Create(Input.Length);
try
// 模擬分塊處理
for i := 1 to Input.Length div 1000 do
begin
chunk := sb.ToString((i-1)*1000, 1000); // 高效擷取區塊
ProcessChunk(chunk);
end;
// 處理餘數
if Input.Length mod 1000 > 0 then
ProcessChunk(sb.ToString((Input.Length div 1000)*1000, Input.Length mod 1000));
finally
sb.Free;
end;
end;
type
TRecord = record
ID: string[10];
Name: string[20];
Value: string[15];
end;
function ParseFixedWidth(const Line: string): TRecord;
var sb: TStringBuilder;
begin
sb := TStringBuilder.Create(Line);
try
Result.ID := Trim(sb.ToString(0, 10));
Result.Name := Trim(sb.ToString(10, 20));
Result.Value := Trim(sb.ToString(30, 15));
finally
sb.Free;
end;
end;
function ExtractToken(sb: TStringBuilder; Start: Integer; Delimiter: Char): string;
var
i, len: Integer;
begin
len := 0;
for i := Start to sb.Length - 1 do
if sb.Chars[i] = Delimiter then Break else Inc(len);
Result := sb.ToString(Start, len);
end;
| 方式 | 完整輸出 | 區間擷取 | 效能 | 記憶體 |
|---|---|---|---|---|
sb.ToString | ✅ | ✅ (StartIndex, Length) | 高 | 單次分配 |
string(sb) 隱性轉換 | ✅ | ❌ | 高 | 單次分配 |
sb.Chars[i] 迴圈 | ✅ | ✅ | 低 (逐字元) | 無額外 |
Copy(string(sb), ...) | ✅ | ✅ | 中 (雙重分配) | 雙重分配 |
Copy(string(sb), ...) 的雙重分配Chars[] 或 CopyTo 到字元陣列TStringBuilder 非介面型別,需手動釋放TStringBuilder.Create(預估長度) 減少擴容開銷TStringBuilder.ToString 的雙重載設計 (ToString / ToString(StartIndex, Length)) 同時滿足完整輸出與高效區間擷取需求。配合 Chars[] 字元級存取,構成了高效能字串建構與解析的完整工具鏈,是處理大量文字、固定寬度解析、串流分段的最佳選擇。