| 類型 | D2007 前 | D2009+ | 編碼 | 最大長度 | 內存管理 | 效能 |
| string | AnsiString | UnicodeString | ANSI/UTF-16 | 2GB | 引用計數、COW | 高 |
| AnsiString | AnsiString | AnsiString | ANSI (代碼頁) | 2GB | 引用計數、COW | 高 |
| WideString | WideString | WideString | UTF-16 | 2GB | COM 規則 (SysAllocString) | 中 |
| ShortString | ShortString | ShortString | ANSI | 255 | 棧/靜態、長度前綴 | 極高 (小字串) |
| String[n] | String[n] | String[n] | ANSI | n (≤255) | 棧/靜態、長度前綴 | 極高 (固定大小) |
string (AnsiString/UnicodeString) — 主力類型
var
str: string;
begin
str := '萬一';
Length(str); // D2007: 4 (位元組) / D2009+: 2 (字元)
// 內存:引用計數 + 長度 + 字元資料 + #0
// 賦值共享、修改觸發 COW 複製
end;
AnsiString — 明確 ANSI 編碼
var
str: AnsiString;
begin
str := '萬一';
Length(str); // 4 (位元組數,受代碼頁影響)
// 適用:檔案讀寫、網路封包、舊 DLL 互操作
// 代碼頁可指定:type MyCP1252 = type AnsiString(1252);
end;
WideString — COM/BCD 互操作專用
var
str: WideString;
begin
str := '萬一';
Length(str); // 2 (字元數,UTF-16)
// 內存:SysAllocString/SysFreeString,無引用計數
// 每次賦值都複製、無 COW、執行緒安全但效能較差
// 必須用於:COM 介面參數、BSTR、OLE Automation
end;
ShortString — 經典 255 字元限制
var
str: ShortString; // 等同 String[255]
begin
str := '萬一的 Delphi 博客';
Length(str); // 18 (字元數)
SizeOf(str); // 256 (固定:255 元素 + 1 長度位元組)
Ord(str[0]); // 18 (第 0 位元組存長度)
// 無 #0 結尾、不兼容 PChar API、棧上分配、極快
end;
String[n] — 固定長度字串
var
str1: String[6]; // 最大 6 字元
str2: String[100];
begin
str1 := '萬一';
Length(str1); // 4
SizeOf(str1); // 7 (6 元素 + 1 長度位元組)
str1 := '萬一的 Delphi 博客'; // 截斷為 '萬一的'
Length(str1); // 6
SizeOf(str1); // 7
// 長度位元組技巧:str2[0] 存實際長度 (0..255)
str2 := 'i' * 65; // 65 個 'i'
ShowMessage(str2[0]); // 'A' (ASCII 65)
Ord(str2[0]); // 65 = 實際長度
// 可像 SetLength 一樣寫入 str2[0] 修改長度
end;
關鍵差異決策樹
需要 COM/BSTR 互操作?
├─ 是 → WideString
└─ 否 → 長度固定且 ≤ 255?
├─ 是 → 極致效能、棧上、無 API 需求?
│ ├─ 是 → String[n] / ShortString
│ └─ 否 → AnsiString / string
└─ 否 → 一般業務邏輯?
├─ 需明確 ANSI/代碼頁 → AnsiString
└─ 現代 Unicode 應用 → string (UnicodeString)
效能微基準測試參考
| 操作 | string | AnsiString | WideString | ShortString | String[50] |
| 賦值 (共享) | 極快 | 極快 | 複製 (慢) | 複製 | 複製 |
| 修改 (COW) | 快 (首次複製) | 快 | 複製 | 原地修改 | 原地修改 |
| 傳參 (const) | 無開銷 | 無開銷 | 複製 | 複製 | 複製 |
| 傳參 (value) | 引用計數+1 | 引用計數+1 | 複製 | 複製 | 複製 |
| API 兼容 (PChar) | D2009+ 需轉換 | 原生 | PWideChar | 不兼容 | 不兼容 |
避坑指南
- WideString 無 COW:高頻拼接極慢,業務邊界外禁用
- ShortString/String[n] 無 #0:傳給 API 必須手動加 #0 或用
StrPCopy
- String[n] 寫入 str[0] 修改長度:危險操作,易導致資料損壞
- AnsiString 代碼頁陷阱:隱式轉換可能丟失字元,跨代碼頁請顯式轉碼
- D2009+ string = UnicodeString:
SizeOf(Char)=2,Length 算字元非位元組
根據「生命週期、互操作對象、長度特徵、效能敏感度」四個維度選型,能最大化發揮 Delphi 字串類型的優勢。
- 上一篇文章: Delphi 字元類型完整對比:Char、AnsiChar、WideChar、PChar、PAnsiChar、PWideChar
- 下一篇文章: Delphi 繪圖進階:Canvas.TextExtent 精確測量文字寬高實戰
Copyright ©
程式碼之家 All Rights Reserved