使用 TArray 而不是 Array of T 的原因是什么?

2024-05-22

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

这一切都遵循类型兼容性规则中描述的文档 http://docwiki.embarcadero.com/RADStudio/XE3/en/Overloads_and_Type_Compatibility_in_Generics像这样:

类型兼容性

两个非实例化泛型被视为赋值 仅当它们相同或是别名时才兼容 普通型。

两个实例化泛型被视为赋值 如果基本类型相同(或者是某个类型的别名),则兼容 普通类型)和类型参数是相同的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 TArray 而不是 Array of T 的原因是什么? 的相关文章

随机推荐

  • 使用 ngx-translate 时更改 URL

    当有人使用 ngx translate 单击所选语言时 我尝试更改 URL 我想我应该通过订阅语言更改事件然后修改当前的 url 以反映所选的语言来做到这一点 因为我是新手 所以我不确定是否需要服务来做到这一点 或者可能是另一种解决方法 我
  • 如何在Java中实现复合模式?

    我想实现一个复合模式Java以便绘制软件开发组织图 因此 我们假设有多个项目经理和多个开发人员 每个开发人员都被分配给一位项目经理 并且每个开发人员都能够使用各种编程语言进行编码 项目经理领导开发人员并准确了解他们的工作量 我对这个设计模式
  • Capistrano 3 部署无法连接到 GitHub - 权限被拒绝(公钥)

    我使用 Capistrano v3 和 capistrano symfony gem 设置了以下部署脚本 我正在使用 Ubuntu 14 4 部署到 AWS EC2 实例 我正在连接从 AWS 下载的 pem 文件 我的deploy rb中
  • PHP 是否有可重用的路由器/调度程序?

    我正在使用一个简单的框架 它根据查询参数处理请求 http example com index php event listPage http example com index php event itemView id 1234 我想将
  • MongoDB:计算数组中的项目数

    我有一个集合 其中集合中的每个文档都有一个名为的数组foo包含一组嵌入文档 目前 MongoDB shell 中是否有一种简单的方法来计算其中有多少个实例foo 就像是 db mycollection foos count or db my
  • 创建 Pyomo 约束的性能

    我正在用 pyomo 设置一个更大的能量优化问题 正如其他中提到的 设置花费了不合理的时间问题 https stackoverflow com questions 43413067 performance of pyomo to gener
  • 是否可以将数组传递给 Amazon Redshift 上的准备好的语句?

    我需要将一个数组传递给 AWS Redshift 上定义的准备好的语句来过滤我的查询 由于 Redshift 不支持此功能 因此我尝试使用 Python UDF 找到解决方法 就像是 a function to split a comma
  • Elasticsearch 无法获取颁发者证书

    我正在尝试使用 LetsEncrypt 加密 tls 证书 但我的服务器页面显示 Kibana server is not ready yet 这是错误 etc kibana kibana yml type log timestamp 20
  • 从哈希中删除 nil 值

    我希望从哈希中删除具有nil value article是一个存储每篇文章的类 并且attributes方法将文章存储为散列 预期结果 articles results author null title Former bar manage
  • Android中从一个应用程序向另一个应用程序发送数据时的加密

    我想将敏感数据从一个应用程序发送到另一个应用程序 我使用 Intent 并通过 Bundle 发送数据 现在 我应该使用加密算法来加密要发送的数据 同时接收器应用程序将解密数据 哪种算法最适合移动平台 我浏览过RSA文档 建议不建议用于长文
  • 使用 rvest 进行抓取 - 当标签不存在时,使用 NA 完成抓取

    我想解析这个 HTML 并从中获取这个元素 a p标签 与class normal encontrado b div with class price 有时 p某些产品中不存在标签 如果是这种情况 NA应添加到从该节点收集文本的向量中 这个
  • 如何在pandas中分组后从每组中选择前n行? [复制]

    这个问题在这里已经有答案了 我有一个具有以下形状的 pandas 数据框 open year open month type col1 col2 我想找到每个 年 月 中的顶级类型 所以我首先找到每个 年 月 中每种类型的计数 freq d
  • 如何使用语法检查变量的度量(名义/序数/规模)?

    我想使用语法找到变量的度量 然后在 If 语句中使用它 使用语法可以吗 例如 如果我有两个变量a 标称 和b 序数 DO IF a is nominal END IF 您可以创建数据中所有名义变量的列表 在以下示例中 列表将存储在宏调用下
  • 有没有比这更快的方法来查找目录和所有子目录中的所有文件?

    我正在编写一个程序 需要在目录及其所有子目录中搜索具有特定扩展名的文件 这将在本地驱动器和网络驱动器上使用 因此性能是一个问题 这是我现在使用的递归方法 private void GetFileList string fileSearchP
  • 停止 ARC 在空闲时释放对象

    我在 Objective C 中遇到内存管理问题 我一直在阅读高级内存管理编程指南 https developer apple com library mac documentation Cocoa Conceptual MemoryMgm
  • 在 Windows Phone 上启动 pdf 文件时出现 System.Runtime.InteropServices.COMException

    我正在尝试使用我之前在另一个应用程序上使用过的以下工作代码打开 pdf 文件 但这一次 当流程到达此行时 我收到 System Runtime InteropServices COMException Windows System Laun
  • 我应该在单元测试中使用 AutoMapper 吗?

    我正在为 ASP NET MVC 控制器方法编写单元测试 这些控制器依赖于IMapper 我创建的用于抽象 AutoMapper 的接口 使用 Castle Windsor 通过构造函数注入传入 动作方法使用IMapper从领域对象映射到
  • 有没有办法在 iOS 上获取相机流的亮度级别?

    我正在使用 iPhone iPad 摄像头获取视频流并在视频流上进行识别 但随着光照的变化 它会对鲁棒性产生负面影响 我已经在不同的光线下测试了不同的设置 并且可以让它工作 但尝试在运行时调整设置是我所需要的 我可以对每一帧进行简单的亮度检
  • 如何从maven中的组中排除所有工件?

    我正在使用 Maven 3 并配置 Enforcer 插件来强制版本收敛 我正在使用 Spring 3 1 2 和 Spring Security 3 1 3 问题是 Spring 3 1 3 POM 声明了对 Spring 3 0 7 的
  • 使用 TArray 而不是 Array of T 的原因是什么?

    我正在将遗留的 Delphi 应用程序迁移到 Delphi XE2 我想知道是否有充分的理由替换定义为的数组Array of MyType to TArray