Delphi 使用TArray的原因是什么<;T>;而不是T的数组?

Delphi 使用TArray的原因是什么<;T>;而不是T的数组?,delphi,delphi-xe2,Delphi,Delphi Xe2,我正在将一个遗留的Delphi应用程序迁移到Delphi-XE2,我想知道是否有充分的理由将定义为MyType的Array的数组替换为TArray。因此,问题是使用TArray代替MyType数组的利与弊是什么?您可以使用一个构造的值初始化TArray: var LArray: TArray<Integer>; begin LArray := TArray<Integer>.Create(1, 2, 3, 4); 主要优点是不太繁重的类型标识规则。考虑: a:

我正在将一个遗留的Delphi应用程序迁移到Delphi-XE2,我想知道是否有充分的理由将定义为MyType的
Array
的数组替换为
TArray
。因此,问题是使用
TArray
代替MyType数组的利与弊是什么?

您可以使用一个构造的值初始化
TArray

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

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

a: array of Integer;
b: array of Integer;
这两个变量不兼容赋值。写入以下内容是编译器错误:

a := b;
另一方面,如果使用通用语法:

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

类似地,我想到的另一个优点是,您可以很容易地使用泛型数组类型作为泛型方法的返回类型

如果没有泛型数组,则必须声明此表单的类型:

TArrayOfT = array of T
在泛型类中,这相当混乱。如果您正在非泛型类中编写泛型方法,那么您就无法进行该声明。通用数组再次解决了这个问题

TMyClass = class
  class function Foo<T>: TArray<T>; static;
end;
TMyClass=class
类函数Foo:TArray;静止的
结束;
所有这些都遵循中描述的类型兼容性规则,如下所示:

类型兼容性

两个非实例化泛型被视为赋值 仅当它们完全相同或是某个对象的别名时才兼容 普通型

两个实例化的泛型被视为赋值 如果基类型相同(或是别名),则兼容 公共类型)和类型参数相同


它对于函数结果很方便

示例:

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

function MyFunc:array of integer; 
begin
end;
等等,要重新设定的泛型:

function MyFunc:TArray<integer>;
begin
end;
函数MyFunc:TArray;
开始
结束;

对于带有泛型的臃肿代码怎么办?问题在XE2/XE3中解决了吗?我不建议将变量声明为TArray。@塞格:这还没有解决,但在这里不适用。问题是方法会被重复多次,但是
TArray
不是一个类,而是一个数组。我很少发现使用
TArray
,但这可能是因为Delphi开发人员仍然像1996年那样编写代码。至少在十年内忽略新语法是一种保守的做法。(咧嘴笑)@Warren我们的代码库使用它完全是出于我在回答中概述的原因。在我看来,这是一个不需要动脑筋的问题。在方法中声明常量数组参数的一个重要方面是使用
AMethod(const a:array of T)而不是
AMethod(常数a:TArray)。前者接受传递任何T数组,也接受常量表达式,如调用
AMethod([1,2,3])
,后者只接受类型为
TArray
TMyIntArr=整数数组的参数;var-LArray:TMyIntArr;LArray:=TMyIntArr.Create(1,2,3,4)工作正常。@LURD:+1,它在Delphi 2007以及支持泛型的更高版本中工作(为了确保这一点,它使用的类型不是integer)。@EricGrange,你能举例说明吗?我在XE3中反汇编了泛型数组创建和动态数组创建,编译器发出相同的代码。对我来说没问题。抱歉,耽搁了,我不经常在这里查看答案,请查看aig的asm:Tarray;ain:整数数组;开始aig:=TArray.Create(1,2);设定长度(ain,2);ain[0]:=1;ain[1]:=2;在第一种情况下,您得到一个数组清除、一个设置长度、一个冗长的值赋值和一个数组赋值;在第二种情况下,您得到的只是一个设置长度和一个直接赋值。@Eric:从阅读您的文章中,我认为应该在这里澄清一下,在某些速度要求很高的情况下,使用createarray伪构造函数可能性能较差。读了上面的评论后,我想你是在说它有问题。不过这篇文章不错。说句公道话,TIntegerDynArray是在什么地方引入的?D4?D6?因此,您应该使用自己定义的类型。
function MyFunc:array of integer; 
begin
end;
function MyFunc:TArray<integer>;
begin
end;