32

我正在将旧版 Delphi 应用程序迁移到 Delphi-XE2,我想知道是否有充分的理由替换定义Array of MyTypeTArray<MyType>. TArray<T>所以问题是使用 Array of MyType 而不是使用的优缺点是什么?

4

3 回答 3

36

主要优点是不那么繁琐的类型标识规则。考虑:

a: array of Integer;
b: array of Integer;

这两个变量不兼容赋值。这是一个编译器错误:

a := b;

另一方面,如果您使用通用语法:

a: TArray<Integer>;
b: TArray<Integer>;

那么这两个变量是赋值兼容的。

当然可以写

type
  TIntegerArray = array of Integer;

但各方需要就同一类型达成一致。如果所有代码都在您的控制范围内,这很好,但是当使用来自各种来源的代码时,通用动态数组的出现会产生巨大的差异。

另一个类似的优点是你可以很容易地使用泛型数组类型作为泛型方法的返回类型。

如果没有泛型数组,您将不得不声明这种形式的类型:

TArrayOfT = array of T

在您的通用类中,这相当混乱。而且,如果您在非泛型类中编写泛型方法,那么您将无法进行该声明。泛型数组再次解决了这个问题。

TMyClass = class
  class function Foo<T>: TArray<T>; static;
end;

这一切都遵循文档中描述的类型兼容性规则,如下所示:

类型兼容性

只有当两个非实例化的泛型相同或者是通用类型的别名时,它们才被认为是赋值兼容的。

如果基本类型相同(或者是通用类型的别名)并且类型参数相同,则两个实例化的泛型被认为是赋值兼容的。

于 2013-01-17T16:10:03.140 回答
22

TArray<T>您可以使用具有一种构造的值进行初始化:

var
  LArray: TArray<Integer>;
begin
  LArray := TArray<Integer>.Create(1, 2, 3, 4);

因为array of Integer您需要编写更多代码:

var
  LArray: array of Integer;
begin
  SetLength(LArray, 4);
  LArray[0] := 1;
  LArray[1] := 2;
  LArray[2] := 3;
  LArray[3] := 4;
于 2013-01-17T16:09:45.903 回答
5

它对函数结果派上用场。

例子:

Delphi中不允许以下内容。您需要在这里声明一个单独的类型。真是浪费时间。

function MyFunc:array of integer; 
begin
end;

等等,resque 的泛型:

function MyFunc:TArray<integer>;
begin
end;
于 2013-01-18T02:06:38.293 回答