Delphi 2009 引入 Generics.Collections,提供 TList<T>、TQueue<T>、TStack<T>、TDictionary<K,V> 等強型別容器,並以 TObjectList<T> 系列對應物件擁有權管理,徹底取代舊版 Classes.TList、Contnrs.TObjectList。
| 特性 | TList<T> | TObjectList<T> |
|---|---|---|
| 元素型別 | 任意 T | 任意 T (通常為類別) |
| 移除元素時 | 僅移除參考 | 自動 Free 物件 |
| Clear 時 | 僅清空列表 | 自動 Free 所有物件 |
| 銷毀容器時 | 不釋放元素物件 | 連帶釋放所有元素物件 |
| OwnsObjects 控制 | 無 (永不擁有) | 固定為 True (無建構子參數關閉) |

type TFelix = class
private fId: Integer;
public constructor Create; destructor Destroy; override;
property Id: Integer read fId write fId;
end;
constructor TFelix.Create; begin fId := gCount; Writeln('Constructor Felix '+IntToStr(fId)); Inc(gCount); end;
destructor TFelix.Destroy; begin Writeln('Destructor Felix '+IntToStr(fId)); inherited; end;
var objList: TObjectList<TFelix>; oldObjList: TObjectList;
{ 舊版 TObjectList }
oldObjList := TObjectList.Create; // 預設 OwnsObjects = True
for n := 0 to 2 do oldObjList.Add(TFelix.Create);
FreeAndNil(oldObjList); // 輸出 3 個 Destructor
{ 舊版 TObjectList.Create(False) }
oldObjList := TObjectList.Create(False); // 不擁有物件
for n := 0 to 2 do oldObjList.Add(TFelix.Create);
FreeAndNil(oldObjList); // 無 Destructor 輸出,物件洩漏
{ 泛型 TObjectList<T> }
objList := TObjectList<TFelix>.Create; // 無 OwnsObjects 參數,固定擁有
for n := 0 to 2 do objList.Add(TFelix.Create);
FreeAndNil(objList); // 輸出 3 個 Destructor
{ 泛型 TList<T> - 不擁有 }
var list: TList<TFelix>;
list := TList<TFelix>.Create;
for n := 0 to 2 do list.Add(TFelix.Create);
FreeAndNil(list); // 無 Destructor,物件存活
// Generics.Collections.pas 核心差異
TList<T>.Notify(const Item: T; Action: TCollectionNotification);
begin
// 基礎版:空實作
end;
TObjectList<T>.Notify(const Item: T; Action: TCollectionNotification);
begin
inherited;
if Action = cnRemoved then TObject(Item).Free; // 關鍵:移除時自動 Free
end;
TObjectList.Create(False) → 改用 TList<T>TQueue<T>/TStack<T>:FIFO/LIFO,同樣有 Object 版本TDictionary<K,V>:雜湊表,TObjectDictionary 管理 Key/Value 物件生命週期TArray:靜態輔助類,提供 Sort/BinarySearch 等陣列操作Delphi 2009 泛型容器以編譯期型別安全、物件擁有權語意明確 (TList 不擁有、TObjectList 擁有)、效能優於舊版 三大優勢,確立現代 Delphi 集合編程標準。理解擁有權轉移機制,是避免記憶體洩漏與重複釋放的關鍵。