存储匿名方法的容器

发布于 2024-11-26 15:34:31 字数 214 浏览 0 评论 0原文

我有以下定义。

type
  TOmniTaskDelegate = reference to procedure(const task: IOmniTask);

我应该使用什么类型的容器(D2009 中应该支持)来存储 TOmniTaskDelegate 实例的列表?目前我正在使用 TOmniTaskDelegate 数组,但我对此并不满意。

I have a following definition.

type
  TOmniTaskDelegate = reference to procedure(const task: IOmniTask);

What type of container should I use (should be supported in D2009) to store a list of TOmniTaskDelegate instances? Currently I'm using array of TOmniTaskDelegate but I'm not really happy with that.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

燃情 2024-12-03 15:34:31

我会使用 TList。由于使用泛型,这是类型安全的,因此它将正确处理其成员的生命周期问题。

I would use TList<TOmniTaskDelegate>. Since this is typesafe due to the use of generics, it will correctly handle the lifetime issues of its members.

风尘浪孓 2024-12-03 15:34:31

编辑:Delphi 2009 包含通用的 TList,我假设它是使用 array of 实现的,就像 Delphi 2010 中的那样。使 TList 成为最佳选择!我保留原来的答案是因为它解释了为什么array of是一个很棒的数据结构,以及为什么使用它会带来很多麻烦。


您选择的 Anonym 数组 对我来说看起来非常好,因为:

  • 匿名方法是托管实体(使用接口实现)。它们需要得到适当的最终确定。
  • 动态数组本身就是托管类型,确保匿名方法引用正确完成。
  • Delphi 2010 通用容器是使用动态数组实现的,因此它们可以胜任这项任务。但请确保您不会将数组逐一增长,而是成块增长。

如果您使用其他任何东西来实现,您需要自己完成参考。示例:

  • 如果您使用普通内存块,您将需要一个析构函数,故意将每个项目设置为 nil(即:不是 ZeroMemory 或 FillChar),以便编译器有机会生成终结代码。
  • 记录是托管对象,它们可以保存对动态方法的引用,但它们只能保存有限数量的引用,如果您需要更多引用,则需要实现一种链表,然后需要仔细管理生命周期。
  • 类遭受记录的所有缺陷,并且在此基础上添加了自己的开销层。

Edit: Delphi 2009 includes the generic TList<T>, I assume it's implemented using array of, just as the one in Delphi 2010. That makes the TList<T> the optimal choice! My original answer stays because it explains why array of is a great data structure and why not using it is a lot of trouble.


Your choice of array of Anonym looks very good to me because:

  • Anonymous methods are managed entities (implemented using interfaces). They need to be properly finalized.
  • The dynamic array is itself a managed type, making sure the anonymous method references are properly finalized.
  • Delphi 2010 generic containers are implemented using dynamic arrays, so they're up to the task. But make sure you don't grow your arrays one-by-one, grow in chunks.

If you use anything else for the implementation you'll need to take care of finalizing the references yourself. Examples:

  • If you use plain blocks of memory you'll need an destructor that deliberately sets each item to nil (ie: not ZeroMemory or FillChar) so the compiler gets a chance to generate finalization code.
  • Records are managed objects, and they could hold references to dynamic methods, but they can only hold a finite number of references, if you need more you'll need to implement a sort of linked list and then you'll need to carefully manage there life cycle.
  • Classes suffer all the deficiencies of records, and they add their own layer of overhead on top of that.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文