用于存储匿名方法的容器

时间:2011-07-26 11:55:53

标签: delphi containers anonymous-methods

我有以下定义。

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

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

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

编辑:Delphi 2009包含通用TList<T>,我假设它是使用array of实现的,就像Delphi 2010中的那样。这使得TList<T>最佳选择!我的原始答案仍然存在,因为它解释了为什么array of是一个很好的数据结构以及为什么使用它是一个很大的麻烦。


您对array of Anonym的选择对我来说非常好,因为:

  • 匿名方法是托管实体(使用接口实现)。他们需要妥善完成。
  • 动态数组本身是一种托管类型,确保正确完成匿名方法引用。
  • Delphi 2010通用容器是使用动态数组实现的,因此他们可以胜任这项任务。但要确保你不要逐个增长你的阵列,然后成长。

如果您使用其他任何内容进行实施,您需要自己完成参考文件的最终确定。例子:

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