如何使用TMyRecord中的通用子列表释放通用TList <tmyrecord>

时间:2016-05-31 14:32:02

标签: delphi generics record generic-list

在Windows下的Delphi 10柏林中,我有关于释放通用列表的以下问题:

我有以下记录/列表结构:

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;

这似乎有效。但我想知道是否有更简单或更优雅的解决方案?

2 个答案:

答案 0 :(得分:4)

您可以将记录类型转换为类 - 开销可以忽略不计,因为记录已包含子对象。此类析构函数中的自由子对象,并使用

T

T

在这种情况下,您只需要

 TMyListOfClasses = TObjectList<TMyClass>;

答案 1 :(得分:2)

您可以为子项定义接口列表,如:

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指定记录的字段,它们将随记录一起自动发布。