我正在将一个遗留的Delphi应用程序迁移到Delphi-XE2,我想知道是否有一个很好的理由将定义为Array of MyType的数组替换为TArray<MyType>。所以问题是用TArray<T>代替MyType的阵列有什么利弊呢?
发布于 2013-01-18 00:10:03
其主要优点是较少繁琐的类型标识规则。考虑一下:
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中描述的类型兼容性规则,如下所示:
类型兼容性
只有当两个未实例化的泛型相同或是公共类型的别名时,它们才被认为是赋值兼容的。
如果基类型相同(或者是公共类型的别名)并且类型参数相同,则认为两个实例化泛型是赋值兼容的。
发布于 2013-01-18 00:09:46
您可以使用一个构造的值来初始化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-18 10:06:38
它在处理函数结果时很方便。
示例:
以下内容在Delphi中是不允许的。你需要在这里声明一个单独的类型。真是浪费时间。
function MyFunc:array of integer;
begin
end;等等,泛型到resque:
function MyFunc:TArray<integer>;
begin
end;https://stackoverflow.com/questions/14383093
复制相似问题