我正在将一个老旧的Delphi应用程序迁移到Delphi-XE2,想知道是否有充分的理由将定义为Array of MyType
的数组替换为TArray<MyType>
。因此问题是使用TArray<T>
与Array of MyType
相比,有哪些利弊?
我正在将一个老旧的Delphi应用程序迁移到Delphi-XE2,想知道是否有充分的理由将定义为Array of MyType
的数组替换为TArray<MyType>
。因此问题是使用TArray<T>
与Array of MyType
相比,有哪些利弊?
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;
这一切都遵循类型兼容性规则,就像文档中描述的那样:
类型兼容性
只有两个未实例化泛型类型相同或别名为一个公共类型时才被认为是可分配兼容的。
只有两个已实例化泛型类型的基础类型相同(或别名为一个公共类型)并且类型参数相同时才被认为是可分配兼容的。
TArray<T>
中的值:var
LArray: TArray<Integer>;
begin
LArray := TArray<Integer>.Create(1, 2, 3, 4);
对于 整数数组
,你需要编写更多的代码:
var
LArray: array of Integer;
begin
SetLength(LArray, 4);
LArray[0] := 1;
LArray[1] := 2;
LArray[2] := 3;
LArray[3] := 4;
type TMyIntArr = array of integer; var LArray : TMyIntArr; LArray := TMyIntArr.Create(1,2,3,4);
运行正常。 - LU RD它对于函数结果非常有用。
例如:
在Delphi中,以下操作是不允许的。您需要在此处声明一个单独的类型。浪费时间啊。
function MyFunc:array of integer;
begin
end;
function MyFunc:TArray<integer>;
begin
end;
TArray<T>
不是一个类,而是一个数组。因此没有需要复制的方法,也就没有代码膨胀的问题。 - Mason WheelerTArray<T>
,但这可能是因为Delphi开发人员仍然大多像1996年一样编写代码。忽略至少十年的新语法是一种保守的做法。(微笑) - Warren PAMethod(const a : array of T);
而不是AMethod(const a : TArray<T>);
是一个重要方面。前者接受传递任何类型为T的数组,包括常量表达式,例如调用AMethod([1,2,3]);
。而后者仅接受类型为TArray<T>
的参数。 - LU RD