delphi 里 多用TArray 而不是 array of
今天写代码发现个bug,是delphi 编译器 核心层面的:
unit ddx.att;
interface
uses System.Generics.Collections, System.Rtti;
type
xstring = string;
InstanceName = class(TCustomAttribute)
private
Fvalue: array of string;
public
constructor Create(AValue: array of string);
end;
implementation
constructor InstanceName.Create(AValue: array of string);
begin
inherited Create;
Fvalue := AValue;
end;

新版本,以后 还是 多用 TArray作为 入参吧;
unit ddx.att;
interface
uses System.Generics.Collections, System.Rtti;
type
xstring = string;
InstanceName = class(TCustomAttribute)
private
Fvalue: TArray<xstring>;
public
constructor Create(AValue: TArray<xstring>);
end;
implementation
constructor InstanceName.Create(AValue: TArray<xstring>);
begin
inherited Create;
Fvalue := AValue;
end;
end.
又做了一个测试 使用 Tarray和 array of 都可以 很好的 作为参数:


在 Delphi 中,array of T 和 TArray<T> 都用于表示动态数组,但它们之间存在一些关键区别,尤其是在类型安全性和使用方式上。
array of T:- 这是 Delphi 中传统的动态数组声明方式。
- 它不是类型安全的,因为你可以将一种类型的动态数组赋值给另一种类型的动态数组(尽管这通常是不安全的,并且可能导致运行时错误)。
- 使用
SetLength函数来分配和重新分配内存。 - 在较旧的 Delphi 版本中,这是创建动态数组的唯一方式。
TArray<T>:TArray<T>是 Delphi 引入泛型后提供的一个动态数组类型,其中T是数组元素的类型。- 它是类型安全的,因为泛型提供了编译时类型检查。这意味着你不能将
TArray<Integer>赋值给TArray<String>,除非显式地进行类型转换(这通常是不可能的,因为它们表示完全不同的元素类型)。 TArray<T>通常与泛型集合类一起使用,提供了更好的代码重用和更强的类型安全性。- 在内部,
TArray<T>实际上就是一个array of T,但编译器为其提供了额外的类型检查和可能的优化。 - 你可以使用
Length函数来获取数组的长度,并且可以通过直接赋值来调整数组大小(这将自动调用SetLength)。
使用建议:
- 如果你正在使用较新的 Delphi 版本(尤其是支持泛型的版本),建议使用
TArray<T>,因为它提供了更好的类型安全性和更现代的编程风格。 - 如果你正在维护较旧的代码库或需要与不支持泛型的库互操作,则可能需要继续使用
array of T。
示例:
使用 array of T:
|
|
var |
|
|
Ints: array of Integer; |
|
|
begin |
|
|
SetLength(Ints, 5); |
|
|
Ints[0] := 10; |
|
|
end; |
使用 TArray<T>:
|
|
var |
|
|
Ints: TArray<Integer>; |
|
|
begin |
|
|
Ints := TArray<Integer>.Create(10, 20, 30, 40, 50); |
|
|
// 或者使用动态数组初始化器 |
|
|
Ints := [10, 20, 30, 40, 50]; |
|
|
end; |
注意:在上面的 TArray<T> 示例中,我使用了动态数组初始化器,这是 Delphi 的一种语法糖,允许你更简洁地初始化动态数组。然而,这种初始化方式实际上在内部调用了 SetLength 和逐个元素的赋值操作。
delphi 里 多用TArray 而不是 array of的更多相关文章
- 为什么API多用C而不是C++,为什么C++程序大多不使用异常
读Defective C++随笔 不尽知用兵之害者,则不能尽知用兵之利也 ——<孙子兵法> 1.为什么API多用C而不是C++以前就一直很奇怪,为什么API大都用C的方式提供,即使有C++ ...
- Delphi里的Windows消息(可查MSDN指定位置)
各种控件的通知消码和控制消息可由MSDN-> Platform SDK-> User Interface Services->Windows User Interface->C ...
- String[255]在高版本Delphi里还是被解释成Byte,总体长度256,使用StrPCopy可以给Array String拷贝字符串(内含许多实验测试)
学了好多不了解的知识: procedure TForm1.Button1Click(Sender: TObject); var s1 : String; s2 : String[]; begin s1 ...
- 终于懂了:WM_PAINT中应该用BeginPaint与EndPaint这两个api,它们的功能正是使无效区域恢复(所以WM_PAINT里即使什么都不做,也必须写上BeginPaint与EndPaint)——Delphi里WM_PAINT消息的三个走向都做到了这一点 good
程序本来是想实现鼠标单击改变背景颜色.可是,程序运行时,为什么没有任何消息触发,背景颜色就一直不断的改变了?WM_PAINT怎么被触发的 #include <windows.h> #inc ...
- 不是什么时候都可以用栈来声明对象并使用(自动释放)——Delphi里到处都是编译器魔法,并且自动帮助实例化界面元素指针
一直都喜欢这样显示窗口,因为简单高效: void MainWidget::ShowMyWindow() { MyWidget form(this); form.resize(,); form.exec ...
- WM_ERASEBKGND官方解释(翻译),以及Delphi里所有的使用情况(就是绘制窗口控件背景色,并阻止进一步传递消息)
#define WM_ERASEBKGND 0x0014 Parameters wParam A handle to the device context. // ...
- Delphi里的RTTI与反射(举例换掉FOnChange)
Delphi2010之后的RTTI做了很大休整,现在用起来很爽了哦.甚至可以获取某些类的内部私有单元,然后为其赋值!讲这个RTTI增强的,可以参考网上的多个博客内容,我列举一下:Delphi2010R ...
- delphi里为程序任务栏右键菜单添加自定义菜单
本文讲解的是为自身程序的任务栏右键菜单里添加自己定义的菜单的方法: delphi添加任务栏右键菜单 procedure TForm1.FormCreate(Sender: TObject); var ...
- delphi里动态创建AlphaControls实现换肤
AlphaControls是一套Delphi下的优秀的皮肤vcl控件.几年前,一般用得比较多的是vclskin,使用很方便,可惜这套2010年已经停止维护了.后来就看到更多的人开始推崇AlphaCon ...
- TControlStyle.csParentBackground的作用(附Delphi里的所有例子,待续)
Only applicable when Themes are enabled in applications on Windows XP. Causes the parent to draw its ...
随机推荐
- 扒一扒爱奇艺影视剧新功能——AI识别、GIF动画生成、画面截图涂鸦
AI 识别 点击画面中的 右侧出现 查看详情 GIF动画生成 点击画面中的 生成GIF动画 画面截图涂鸦 截图 涂鸦
- 使用ensp搭建路由拓扑,并使用BGP协议实现网络互通实操
转载请注明出处: 1.使用ENSP搭建的网络拓扑如下: 数据准备: 设备名称 接口 IP地址 DeviceA Loopback 0 1.1.1.1/32 Eth 1/0/0 172.16.0.1/16 ...
- JS - 兼容到 IE 8
使用 jQuery可以有效的兼容IE 浏览器 , 但jQuery从2.0开始不兼容IE8,最低支持IE9,所以需要引入更低的jQuery版本来兼容 <script type="text ...
- GB18030-2022 标准学习
GB18030-2022 标准学习 下载 https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=A1931A578FE14957104988029B08 ...
- [转帖]堆表(HOT)和索引组织表(IOT)优缺点
转载于: https://www.ywnds.com/?p=7702 一.堆表和索引组织表 NOTE 堆表也可以称之为 HOT,索引组织表也可以称之为 IOT,下面没有特别说明,两者都是一个意思. ...
- Harbor修改默认网段以及设置开机启动的方法
Harbor修改默认网段以及设置开机启动的方法 背景 docker 默认的网段是 172.16.xx.xx 网段. harbor进行设置时会自动加1 设置为 172.17.xx.xx 有时候这个网段是 ...
- [转帖]S3FS 简介及部署
PS:文章一般都会先首发于我的个人Blog上:S3FS 简介及部署 · TonghuaRoot's BloG. ,有需要的小伙伴可以直接订阅我的Blog,获取最新内容. 0x00 前言 S3FS可以把 ...
- [转帖]Linux内核映像vmlinux、Image、zImage、uImage区别
https://zhuanlan.zhihu.com/p/466226177 本文介绍几种常用的Linux内核映像的区别. 一.vmlinux vmlinux:Linux内核编译出来的原始的内核文件, ...
- [转帖]兆芯官方的CPU测试成绩,我复现不了
https://baijiahao.baidu.com/s?id=1734998483605483848 下图是兆芯网官上的公开测试成绩,测试对象是3.0GHz的KX-U6880A. 有几个问题: ...
- 查看java所有的线程信息
最近一直有一个困惑, 不知道如何查看所有的java的线程信息. 今天看blog时发现了一个简单方法 ps -Tp $pid 就可以了 也可以使用 ps- Lfp $pid的方式 这里简单写一下统计方法 ...