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