首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 字串類型全家族解析:string、AnsiString、WideString、ShortString、String[n]

     編輯:Delphi

Delphi 五大字串類型特性、內存佈局與選型指南

Delphi 提供 string、AnsiString、WideString、ShortString、String[n] 五種字串類型,它們在內存管理、編碼、長度限制、效能上有本質差異。本文系統對比,助你按場景選型。

類型特性對比總表

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)

效能微基準測試參考

類型D2007 前D2009+編碼最大長度內存管理效能
stringAnsiStringUnicodeStringANSI/UTF-162GB引用計數、COW高
AnsiStringAnsiStringAnsiStringANSI (代碼頁)2GB引用計數、COW高
WideStringWideStringWideStringUTF-162GBCOM 規則 (SysAllocString)中
ShortStringShortStringShortStringANSI255棧/靜態、長度前綴極高 (小字串)
String[n]String[n]String[n]ANSIn (≤255)棧/靜態、長度前綴極高 (固定大小)

避坑指南

  1. WideString 無 COW:高頻拼接極慢,業務邊界外禁用
  2. ShortString/String[n] 無 #0:傳給 API 必須手動加 #0 或用 StrPCopy
  3. String[n] 寫入 str[0] 修改長度:危險操作,易導致資料損壞
  4. AnsiString 代碼頁陷阱:隱式轉換可能丟失字元,跨代碼頁請顯式轉碼
  5. D2009+ string = UnicodeString:SizeOf(Char)=2,Length 算字元非位元組

根據「生命週期、互操作對象、長度特徵、效能敏感度」四個維度選型,能最大化發揮 Delphi 字串類型的優勢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
操作stringAnsiStringWideStringShortStringString[50]
賦值 (共享)極快極快複製 (慢)複製複製
修改 (COW)快 (首次複製)快複製原地修改原地修改
傳參 (const)無開銷無開銷複製複製複製
傳參 (value)引用計數+1引用計數+1複製複製複製
API 兼容 (PChar)D2009+ 需轉換原生PWideChar不兼容不兼容