Delphi如何实现一个长尾词的记录列表功能?

2026-04-10 17:302阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计553个文字,预计阅读时间需要3分钟。

Delphi如何实现一个长尾词的记录列表功能?

后续问题到 this question:(请注意,这并非重复,我在这里要求替代方案)。是否存在以下工作方法:type List=record private FList: TList; FGuard: IInterface; procedure CheckCreated;public procedure Add(con);end;

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

有没有办法做以下工作:

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 Result.Add (2); Result.Add (3); end;

正如在链接问题的答案中所解释的那样,这不起作用(这实际上很棘手).它不会在每次调用时创建新列表.

不幸的是,这也不起作用:

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

它会泄漏保护接口和所有列表,因为Initialize只会覆盖接口引用而不会减少引用计数.

有没有办法让这项工作?或者你会建议把它作为一个界面而不是记录,只是住在施工线上?

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

谢谢你的帮助!

如果我理解正确,这应该可以正常工作:

Delphi如何实现一个长尾词的记录列表功能?

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

Finalize调用将确保将所有托管类型设置为nil,我认为这是您的意图.

这个问题与您之前的问题密切相关,我认为您可以使用out参数来简化代码.函数结果隐式为var参数,但如果使用显式out参数,则会根据需要初始化托管类型.

procedure InitializeHandles(out Handles : List <THandle>); begin Handles.Add (2); Handles.Add (3); end;

就个人而言,既然你在混合中引入了一个接口,我想我会倾向于一路走下去并专门使用接口.或者使用标准类并接受try / finally生命周期管理的需要.

本文共计553个文字,预计阅读时间需要3分钟。

Delphi如何实现一个长尾词的记录列表功能?

后续问题到 this question:(请注意,这并非重复,我在这里要求替代方案)。是否存在以下工作方法:type List=record private FList: TList; FGuard: IInterface; procedure CheckCreated;public procedure Add(con);end;

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

有没有办法做以下工作:

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 Result.Add (2); Result.Add (3); end;

正如在链接问题的答案中所解释的那样,这不起作用(这实际上很棘手).它不会在每次调用时创建新列表.

不幸的是,这也不起作用:

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

它会泄漏保护接口和所有列表,因为Initialize只会覆盖接口引用而不会减少引用计数.

有没有办法让这项工作?或者你会建议把它作为一个界面而不是记录,只是住在施工线上?

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

谢谢你的帮助!

如果我理解正确,这应该可以正常工作:

Delphi如何实现一个长尾词的记录列表功能?

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

Finalize调用将确保将所有托管类型设置为nil,我认为这是您的意图.

这个问题与您之前的问题密切相关,我认为您可以使用out参数来简化代码.函数结果隐式为var参数,但如果使用显式out参数,则会根据需要初始化托管类型.

procedure InitializeHandles(out Handles : List <THandle>); begin Handles.Add (2); Handles.Add (3); end;

就个人而言,既然你在混合中引入了一个接口,我想我会倾向于一路走下去并专门使用接口.或者使用标准类并接受try / finally生命周期管理的需要.