| 特性 | 記錄 | 類別 |
|---|---|---|
| 關鍵字 | record | class |
| 記憶體配置 | 棧上,直接包含資料 | 堆上,變數是指標 |
| 變數大小 | 資料總大小 | 指標大小(32-bit=4Bytes, 64-bit=8Bytes) |
| 建立方式 | 宣告即可用 | 需呼叫 Create 建構子 |
| 釋放方式 | 離開作用域自動釋放 | 需手動呼叫 Free |
| 指派行為 | 值複製 | 參考複製(指向同一物件) |
| 繼承支援 | 不支援 | 支援單一繼承 |
| 介面實作 | 不支援 | 支援 |
| 虛擬方法/多態 | 不支援 | 支援 |
type
TMyRecord = record
D: TDate;
end;
TMyClass = class
D: TDate;
end;
var
MyRec: TMyRecord;
MyCls: TMyClass;
begin
// 記錄:直接使用
MyRec.D := Now;
ShowMessage(DateToStr(MyRec.D));
ShowMessage(IntToStr(SizeOf(MyRec))); // 8 bytes (TDate 大小)
// 類別:需實例化
MyCls := TMyClass.Create; // 配置堆記憶體
MyCls.D := Now;
ShowMessage(DateToStr(MyCls.D));
ShowMessage(IntToStr(SizeOf(MyCls))); // 4 bytes (指標大小)
MyCls.Free; // 手動釋放
end;
記錄變數 (Stack) 類別變數 (Stack) → 物件
+----------------+ +----------------+ +----------------+
| TDate 資料 | | 指標 (4/8B) | ──→ | TDate 資料 |
+----------------+ +----------------+ +----------------+
| VMT 指標 |
+----------------+
Delphi 2007+ 支援進階記錄:可包含方法、建構子、屬性、運算子多載,但仍為值型別、無繼承、無虛擬方法表。
類別本質是「指向堆上物件的指標」,記錄是「棧上直接資料」。理解這點,能避免常見錯誤(如未 Create 就存取、忘記 Free、指派誤以為複製值),並做出正確的架構決策。