如何在 TMyRecord 中释放带有通用子列表的通用 TList<TMyRecord>
How to free a generic TList<TMyRecord> with generic sub lists in TMyRecord
在 Delphi 10 Berlin under Windows 我有以下关于释放通用列表的问题:
我有以下 record/list 结构:
type
TMyRecord=record
Value1: Real;
SubList1: TList<Integer>;
SubList2: TList<Real>;
end;
TMyListOfRecords=TList<TMyRecord>;
我想使用以下代码释放结构:
var
i: Integer;
AMyListOfRecords: TMyListOfRecords;
begin
//other code
//free AMyListOfRecords and all its content
for i:=0 to AMyListOfRecords.Count-1 do
begin
AMyListOfRecords[i].SubList1.Free;
AMyListOfRecords[i].SubList2.Free;
end;
AMyListOfRecords.Free;
end;
这似乎有效。但我想知道是否有更简单或更优雅的解决方案?
您可以将记录类型转换为 class - 开销可以忽略不计,因为记录已经包含子对象。在这个 class 析构函数中释放子对象,并使用
TMyListOfClasses = TObjectList<TMyClass>;
和OwnsObjects = True
在这种情况下,您只需要
AMyListOfClasses.Free;
您可以为子项定义接口列表,例如:
type
TMyRecord=record
Value1: Real;
SubList1: IList<Integer>;
SubList2: IList<Real>;
end;
TMyListOfRecords=TList<TMyRecord>;
IList 的类型是:
type
IList<T> = interface
function Add(const AValue: T): Integer;
function Remove(AValue: T): Integer;
end;
你在哪里实现它:
TIntfList<T> = class(TInterfacedObject, IList<T>)
private
FList: TList<T>;
function Add(const AValue: T): Integer;
function Remove(AValue: T): Integer;
constructor Create;
destructor Destroy; override;
end;
{ TIntfList<T> }
function TIntfList<T>.Add(const AValue: T): Integer;
begin
Result := FList.Add(AValue);
end;
constructor TIntfList<T>.Create;
begin
FList := TList<T>.Create;
end;
destructor TIntfList<T>.Destroy;
begin
FList.Free;
inherited;
end;
function TIntfList<T>.Remove(AValue: T): Integer;
begin
Result := FList.Remove(AValue);
end;
之后您可以使用 TIntfList.Create 分配记录的字段,它们将随您的记录一起自动释放。
在 Delphi 10 Berlin under Windows 我有以下关于释放通用列表的问题:
我有以下 record/list 结构:
type
TMyRecord=record
Value1: Real;
SubList1: TList<Integer>;
SubList2: TList<Real>;
end;
TMyListOfRecords=TList<TMyRecord>;
我想使用以下代码释放结构:
var
i: Integer;
AMyListOfRecords: TMyListOfRecords;
begin
//other code
//free AMyListOfRecords and all its content
for i:=0 to AMyListOfRecords.Count-1 do
begin
AMyListOfRecords[i].SubList1.Free;
AMyListOfRecords[i].SubList2.Free;
end;
AMyListOfRecords.Free;
end;
这似乎有效。但我想知道是否有更简单或更优雅的解决方案?
您可以将记录类型转换为 class - 开销可以忽略不计,因为记录已经包含子对象。在这个 class 析构函数中释放子对象,并使用
TMyListOfClasses = TObjectList<TMyClass>;
和OwnsObjects = True
在这种情况下,您只需要
AMyListOfClasses.Free;
您可以为子项定义接口列表,例如:
type
TMyRecord=record
Value1: Real;
SubList1: IList<Integer>;
SubList2: IList<Real>;
end;
TMyListOfRecords=TList<TMyRecord>;
IList 的类型是:
type
IList<T> = interface
function Add(const AValue: T): Integer;
function Remove(AValue: T): Integer;
end;
你在哪里实现它:
TIntfList<T> = class(TInterfacedObject, IList<T>)
private
FList: TList<T>;
function Add(const AValue: T): Integer;
function Remove(AValue: T): Integer;
constructor Create;
destructor Destroy; override;
end;
{ TIntfList<T> }
function TIntfList<T>.Add(const AValue: T): Integer;
begin
Result := FList.Add(AValue);
end;
constructor TIntfList<T>.Create;
begin
FList := TList<T>.Create;
end;
destructor TIntfList<T>.Destroy;
begin
FList.Free;
inherited;
end;
function TIntfList<T>.Remove(AValue: T): Integer;
begin
Result := FList.Remove(AValue);
end;
之后您可以使用 TIntfList.Create 分配记录的字段,它们将随您的记录一起自动释放。