Delphi 列出有记录的执行情况

Delphi 列出有记录的执行情况,delphi,delphi-xe,records,Delphi,Delphi Xe,Records,后续问题:(请注意,这不是重复的,我在这里要求的是替代方案) 是否有任何方法可以完成以下工作: type List <T> = record private FList : TList <T>; FGuard : IInterface, procedure CheckCreated; public procedure Add(const Value : T); end; procedure List <T>.

后续问题:(请注意,这不是重复的,我在这里要求的是替代方案)

是否有任何方法可以完成以下工作:

type
  List <T> = record
  private
    FList  : TList <T>;
    FGuard : IInterface,
    procedure CheckCreated;
  public
    procedure Add(const Value : T);
  end;

procedure List <T>.CheckCreated;
begin
if (FGuard = nil) then
  begin
  FList := TList <T>.Create;
  FGuard := TGuard.Create (FList);    // guard calls free on list in destructor
  end;
end;

procedure List <T>.Add (const Value : T);
begin
CheckCreated;
FList.Add (Value);
end;

谢谢你的帮助

如果我正确理解您的意思,这应该很好:

function ReturnHandles : List <THandle>;
begin
  Finalize(Result);
  Result.Add (2);
  Result.Add (3);
end;

就我个人而言,由于您在混合中引入了一个接口,我认为我倾向于一直只使用接口。或者使用标准类并接受try/finally生命周期管理的需要。

Rob在您的上一个问题中解释说,
Initialize
是gabr回答中的一个错误。所以,不,你不应该使用它。这就是我写的…问题是,是否有其他方法可以实现这一点,或者是否无法创建包含对象的值类型。你违反了Delphi中的规则。这样做可能会让你在“道路”上走上一段距离,但你会发现你的记录类型方法要付出巨大的代价。@WarrenP你能澄清一下你认为“巨大的代价”是什么吗?例如,你是否打算允许这些基于记录的列表进行深度复制?谢谢,我错过了这些信息!但不是很直观。我可能会选择界面解决方案。不幸的是,我将失去使用运算符重载的可能性:(我不得不说,直到昨天你提出问题之前,我从未听说过这个
Initialize
函数!谢谢你的输入!这是我第一次发现这种语言真的有局限性。我必须强迫所有调用方记住以这种方式使用它时调用
Finalize
,否则我必须放弃运算符重载和gene列表中的ric方法。我想还有一些改进可能使语言更通用。您是否尝试过使用
out
参数而不是函数?
out
var
参数有不同的语义(这就是函数结果)“你应该做你想做的事情。”“是的,我认为这里没有一个理想的解决方案可以实现你所有的目标
function ReturnHandles : List <THandle>;
begin
Initialize (Result);
Result.Add (2);
Result.Add (3);
end;
function ReturnHandles : List <THandle>;
begin
Result := List <T>.Create;
Result.Add (2);
Result.Add (3);   
end;
function ReturnHandles : List <THandle>;
begin
  Finalize(Result);
  Result.Add (2);
  Result.Add (3);
end;
procedure InitializeHandles(out Handles : List <THandle>);
begin
  Handles.Add (2);
  Handles.Add (3);
end;