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 ...
随机推荐
- 【内核】深入分析内核panic(三)--内核错误处理流程
1 内核错误处理方式 当内核出现致命错误时,只要cpu还能正常运行,那么最重要的就是向用户输出详细的错误信息,以及保存问题出现时的错误现场.以上致命错误可包含以下两种类型: (1)硬件能检测到的错误, ...
- SpringBoot 动态多线程并发定时任务
一.简介 实现定时任务有多种方式: Timer:jdk 中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行.提供的功能比较单一,无法实现复杂的调度任务. ScheduledExecutorS ...
- 每天学五分钟 Liunx 0100 | 服务篇:进程状态
多任务和 CPU 时间片 前面说了 Liunx 是多用户多任务的,所谓的多任务就是多个进程"同时"执行.比如,同时开多个软件(进程),对于用户来说好像每个软件(进程)都在工作,但是 ...
- SpringCloud集成Seata并使用Nacos做注册中心与配置中心
本文为博主原创,未经允许不得转载: 目录: 1. 下载并启动Seata Server,并指定nacos作为配置中心和注册中心 2. 同步seata server的配置到nacos 3. 启动Seata ...
- 我想快速给WPF程序添加托盘菜单
我想快速给WPF程序添加托盘菜单 1 简单要求: 使用开源控件库 在XAML中声明托盘菜单,就像给控件添加ContextMenu一样 封装了常用命令,比如:打开主窗体.退出应用程序等 我在Termin ...
- crypto常用工具
古典密码 维吉尼亚密码(Vigenere): https://github.com/atomcated/Vigenere(加密解密程序,包含自动猜测密钥功能) https://www.guballa. ...
- [转帖]Jmeter创建简单的HTTP(S)请求测试-3
在上一章节中,介绍了Jmeter基本的组成组件,那么我们如何使用这些组件去完成测试呢,以下将通过创建一个简单的HTTP(S)测试进行说明,另外,除JDBC请求外,Jmeter进行测试构建的步骤大同小异 ...
- [转帖]3.3.6. 活跃会话历史报告SYS_KSH
https://help.kingbase.com.cn/v8/perfor/performance-optimization/performance-optimization-6.html#sys- ...
- [转帖]SpringBoot配置SSL 坑点总结【密码验证失败、连接不安全】
文章目录 前言 1.证书绑定问题 2.证书和密码不匹配 3.yaml配置文件问题 3.1 解密类型和证书类型是相关的 3.2 配置文件参数混淆 后记 前言 在SpringBoot服务中配置ssl,无非 ...
- [转帖]技术派-epoll和IOCP之比较
直入正题 Epoll 用于Linux系统: IOCP 是用于 Windows: Epoll 是当事件资源满足时发出可处理通知消息: IOCP 则是当事件完成时发出完成通知消息. 从应用程序的角度来看, ...