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;