首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用TArray<T>而不是数组的原因是什么?

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

Stack Overflow用户
提问于 2013-01-18 00:02:28
回答 3查看 28.1K关注 0票数 32

我正在将一个遗留的Delphi应用程序迁移到Delphi-XE2,我想知道是否有一个很好的理由将定义为Array of MyType的数组替换为TArray<MyType>。所以问题是用TArray<T>代替MyType的阵列有什么利弊呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-18 00:10:03

其主要优点是较少繁琐的类型标识规则。考虑一下:

代码语言:javascript
复制
a: array of Integer;
b: array of Integer;

这两个变量不兼容赋值。这样写是一个编译器错误:

代码语言:javascript
复制
a := b;

另一方面,如果使用通用语法:

代码语言:javascript
复制
a: TArray<Integer>;
b: TArray<Integer>;

那么这两个变量是赋值兼容的。

当然,你可以写

代码语言:javascript
复制
type
  TIntegerArray = array of Integer;

但所有各方都需要就同一类型达成一致。如果所有代码都在您的控制之下,这是很好的,但是当使用来自不同来源的代码时,泛型动态数组的出现会产生巨大的不同。

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

如果没有泛型数组,则必须声明以下形式的类型:

代码语言:javascript
复制
TArrayOfT = array of T

在泛型类中,这是相当混乱的。如果要在非泛型类中编写泛型方法,则无法进行声明。同样,泛型数组解决了这个问题。

代码语言:javascript
复制
TMyClass = class
  class function Foo<T>: TArray<T>; static;
end;

这一切都源于documentation中描述的类型兼容性规则,如下所示:

类型兼容性

只有当两个未实例化的泛型相同或是公共类型的别名时,它们才被认为是赋值兼容的。

如果基类型相同(或者是公共类型的别名)并且类型参数相同,则认为两个实例化泛型是赋值兼容的。

票数 36
EN

Stack Overflow用户

发布于 2013-01-18 00:09:46

您可以使用一个构造的值来初始化TArray<T>

代码语言:javascript
复制
var
  LArray: TArray<Integer>;
begin
  LArray := TArray<Integer>.Create(1, 2, 3, 4);

对于array of Integer,您需要编写更多的代码:

代码语言:javascript
复制
var
  LArray: array of Integer;
begin
  SetLength(LArray, 4);
  LArray[0] := 1;
  LArray[1] := 2;
  LArray[2] := 3;
  LArray[3] := 4;
票数 22
EN

Stack Overflow用户

发布于 2013-01-18 10:06:38

它在处理函数结果时很方便。

示例:

以下内容在Delphi中是不允许的。你需要在这里声明一个单独的类型。真是浪费时间。

代码语言:javascript
复制
function MyFunc:array of integer; 
begin
end;

等等,泛型到resque:

代码语言:javascript
复制
function MyFunc:TArray<integer>;
begin
end;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14383093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档