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

Delphi 2009 泛型容器入門體驗:TList、TObjectList 核心差異與物件擁有權管理

     編輯:Delphi

泛型容器新紀元

Delphi 2009 引入 Generics.Collections,提供 TList<T>、TQueue<T>、TStack<T>、TDictionary<K,V> 等強型別容器,並以 TObjectList<T> 系列對應物件擁有權管理,徹底取代舊版 Classes.TList、Contnrs.TObjectList。

核心差異:TList vs 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<T>:容器為物件唯一擁有者,生命週期綁定
  • 使用 TList<T>:物件由外部管理、或同時存在多個容器中
  • 避免混用:同一物件實例勿同時加入擁有版與非擁有版容器
  • 舊版遷移: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 集合編程標準。理解擁有權轉移機制,是避免記憶體洩漏與重複釋放的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved