Sal*_*dor 30 delphi delphi-xe2
我迁移遗留Delphi应用程序到德尔福XE2,我想知道如果有一个很好的理由,以取代定义为数组Array of MyType
来TArray<MyType>
.所以问题是TArray<T>
使用的优缺点是什么,而不是MyType数组?
Dav*_*nan 34
主要优点是较少繁重的类型标识规则.考虑:
a: array of Integer;
b: array of Integer;
Run Code Online (Sandbox Code Playgroud)
这两个变量不兼容.编写错误是编译错误:
a := b;
Run Code Online (Sandbox Code Playgroud)
另一方面,如果您使用通用语法:
a: TArray<Integer>;
b: TArray<Integer>;
Run Code Online (Sandbox Code Playgroud)
然后这两个变量是赋值兼容的.
当然,你可以写
type
TIntegerArray = array of Integer;
Run Code Online (Sandbox Code Playgroud)
但所有各方都需要就同一类型达成一致.如果所有代码都在你的控制之下就没问题了,但是当使用来自各种来源的代码时,通用动态数组的出现会产生巨大的差异.
与此类似的是,您可以轻松地使用通用数组类型作为泛型方法的返回类型.
如果没有泛型数组,则必须声明此表单的类型:
TArrayOfT = array of T
Run Code Online (Sandbox Code Playgroud)
在你的泛型类中,这是相当混乱的.如果您在非泛型类中编写泛型方法,那么您无法进行该声明.通用数组再次解决了这个问题.
TMyClass = class
class function Foo<T>: TArray<T>; static;
end;
Run Code Online (Sandbox Code Playgroud)
这一切都遵循文档中描述的类型兼容性规则,如下所示:
类型兼容性
两个非实例化的泛型只有在它们相同或者是普通类型的别名时才被认为是赋值兼容的.
如果基类型相同(或者是常见类型的别名)并且类型参数相同,则两个实例化泛型被认为是赋值兼容的.
Lin*_*nas 20
您可以TArray<T>
使用一个构造初始化值:
var
LArray: TArray<Integer>;
begin
LArray := TArray<Integer>.Create(1, 2, 3, 4);
Run Code Online (Sandbox Code Playgroud)
因为array of Integer
你需要编写更多的代码:
var
LArray: array of Integer;
begin
SetLength(LArray, 4);
LArray[0] := 1;
LArray[1] := 2;
LArray[2] := 3;
LArray[3] := 4;
Run Code Online (Sandbox Code Playgroud)
它对功能结果很方便.
例:
Delphi中不允许以下内容.您需要在此声明一个单独的类型.真是浪费时间.
function MyFunc:array of integer;
begin
end;
Run Code Online (Sandbox Code Playgroud)
等等,通知resque:
function MyFunc:TArray<integer>;
begin
end;
Run Code Online (Sandbox Code Playgroud)