使用TArray <t>而不是T?</t>的数据是什么原因

时间:2013-01-17 16:02:28

标签: delphi delphi-xe2

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

3 个答案:

答案 0 :(得分:32)

主要优点是较少繁重的类型标识规则。考虑:

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;

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

  

类型兼容性

     

两个非实例化的泛型被认为是赋值   仅当它们相同或是a的别名时才兼容   普通类型。

     

两个实例化的泛型被认为是赋值   如果基类型相同(或者是a的别名)是兼容的   common type)和类型参数相同。

答案 1 :(得分:19)

您可以使用一个结构初始化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;

答案 2 :(得分:5)

它对功能结果很方便。

示例:

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

function MyFunc:array of integer; 
begin
end;

等待,resque的泛型:

function MyFunc:TArray<integer>;
begin
end;