【问题标题】:Delphi generic classes and dynamic arraysDelphi 泛型类和动态数组
【发布时间】:2017-05-06 05:31:30
【问题描述】:

我已多次阅读this 问题中关于TArray<T>array of T 的答案。据我了解,第一个的使用比后者更通用,因为对于动态数组,我应该声明一个类似...的类型

type
   TMyFlexibleArray = array of Integer;

...这是必需的(在某些情况下),因为例如我无法返回 array of Integer。相反,当然,我可以返回一个泛型类型。动态数组没有固定长度,它们的内存通过 SetLength 过程重新分配。 TArray 是一个具有静态方法的泛型类;关于它的文档指出:

你不应该创建这个类的实例,因为它只是 目的是提供排序和搜索的静态方法。


它们具有两种不同的性质/功能,但它们是否具有相同的结果(例如,当作为参数传递时,或者当我只需要一个灵活的容器时)?我看到 TArray 也有一些有用的方法。

如果我说TArray<T> 是一个用泛型构建的动态数组,而type K = array of T 是一个自己的动态数组(自定义数组)是正确的吗?在我的问题中,我假设它们在作为动态数组的功能上是等价的(我更喜欢通用方式只是为了舒适)。

【问题讨论】:

  • 我猜您必须在它们之间进行选择的唯一真实情况是(例如)如果您使用的是 Delphi 5,因为它根本没有泛型。在最近的版本中,您可以同时使用两者并具有相同的效果。其中一部分,我更喜欢使用 TArray 但这只是我的选择
  • 我不明白你为什么在你的问题中引入System.Generics.Collections.TArray。这是一个类,不要与动态数组(通用或非通用)混淆。

标签: arrays delphi


【解决方案1】:

泛型动态数组和非泛型动态数组在各方面都是相同的,除了它们的泛型或其他性质。这是唯一的区别。

这种差异推动了在少数情况下可以使用一种但不能使用另一种的情况下的决策。例如:

  • 由于您的问题中列出的原因,在使用泛型类型时,有时需要使用泛型数组。
  • 另一方面,在编写希望在泛型之前的旧编译器上编译的代码时,不能使用泛型数组。

如果这看起来很明显,那是因为它是。泛型数组和非泛型数组之间确实只有一个区别。


您还提到了来自System.Generics.Collections 的课程TArray。这是一个静态类,包含搜索和排序数组的方法。它与任何动态数组类型完全不同,而且这里有些让人分心。尽管名称相似,但TArray<T>TArray 这些是完全不同的东西。出于此问题的目的,请忽略 TArray

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 2020-01-23
    • 2014-01-11
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    相关资源
    最近更新 更多