今天写代码发现个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> 都用于表示动态数组,但它们之间存在一些关键区别,尤其是在类型安全性和使用方式上。

  1. array of T

    • 这是 Delphi 中传统的动态数组声明方式。
    • 它不是类型安全的,因为你可以将一种类型的动态数组赋值给另一种类型的动态数组(尽管这通常是不安全的,并且可能导致运行时错误)。
    • 使用 SetLength 函数来分配和重新分配内存。
    • 在较旧的 Delphi 版本中,这是创建动态数组的唯一方式。
  2. 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

 
delphi复制代码
 
 
var
 
Ints: array of Integer;
 
begin
 
SetLength(Ints, 5);
 
Ints[0] := 10;
 
end;
 

使用 TArray<T>

 
delphi复制代码
 
 
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的更多相关文章

  1. 为什么API多用C而不是C++,为什么C++程序大多不使用异常

    读Defective C++随笔 不尽知用兵之害者,则不能尽知用兵之利也 ——<孙子兵法> 1.为什么API多用C而不是C++以前就一直很奇怪,为什么API大都用C的方式提供,即使有C++ ...

  2. Delphi里的Windows消息(可查MSDN指定位置)

    各种控件的通知消码和控制消息可由MSDN-> Platform SDK-> User Interface Services->Windows User Interface->C ...

  3. String[255]在高版本Delphi里还是被解释成Byte,总体长度256,使用StrPCopy可以给Array String拷贝字符串(内含许多实验测试)

    学了好多不了解的知识: procedure TForm1.Button1Click(Sender: TObject); var s1 : String; s2 : String[]; begin s1 ...

  4. 终于懂了:WM_PAINT中应该用BeginPaint与EndPaint这两个api,它们的功能正是使无效区域恢复(所以WM_PAINT里即使什么都不做,也必须写上BeginPaint与EndPaint)——Delphi里WM_PAINT消息的三个走向都做到了这一点 good

    程序本来是想实现鼠标单击改变背景颜色.可是,程序运行时,为什么没有任何消息触发,背景颜色就一直不断的改变了?WM_PAINT怎么被触发的 #include <windows.h> #inc ...

  5. 不是什么时候都可以用栈来声明对象并使用(自动释放)——Delphi里到处都是编译器魔法,并且自动帮助实例化界面元素指针

    一直都喜欢这样显示窗口,因为简单高效: void MainWidget::ShowMyWindow() { MyWidget form(this); form.resize(,); form.exec ...

  6. WM_ERASEBKGND官方解释(翻译),以及Delphi里所有的使用情况(就是绘制窗口控件背景色,并阻止进一步传递消息)

    #define WM_ERASEBKGND                   0x0014 Parameters wParam A handle to the device context. //  ...

  7. Delphi里的RTTI与反射(举例换掉FOnChange)

    Delphi2010之后的RTTI做了很大休整,现在用起来很爽了哦.甚至可以获取某些类的内部私有单元,然后为其赋值!讲这个RTTI增强的,可以参考网上的多个博客内容,我列举一下:Delphi2010R ...

  8. delphi里为程序任务栏右键菜单添加自定义菜单

    本文讲解的是为自身程序的任务栏右键菜单里添加自己定义的菜单的方法: delphi添加任务栏右键菜单 procedure TForm1.FormCreate(Sender: TObject); var ...

  9. delphi里动态创建AlphaControls实现换肤

    AlphaControls是一套Delphi下的优秀的皮肤vcl控件.几年前,一般用得比较多的是vclskin,使用很方便,可惜这套2010年已经停止维护了.后来就看到更多的人开始推崇AlphaCon ...

  10. TControlStyle.csParentBackground的作用(附Delphi里的所有例子,待续)

    Only applicable when Themes are enabled in applications on Windows XP. Causes the parent to draw its ...

随机推荐

  1. freeswitch上报信令到HOMER的配置方案

    概述 HOMER是一款100%开源的针对SIP/VOIP/RTC的抓包工具和监控工具. 之前的文章中,我们介绍了HOMER的安装步骤,HOMER7的安装部署还是比较简单的,安装过程也比较顺利. 然后, ...

  2. Liunx常用操作(九)-进阶命令

    一.查看用户who 1.查看所有用户:who

  3. (已解决)pulse secure 连接功能变灰禁用 连接面板找不到

    今天打开 pulse secure 时,发现窗口变成了这样: 连接功能是灰色的,被禁用了: 解决方案: 运行 PulseSecureService 服务. 然后就正常了!

  4. Logback 实现日志链路追踪

    本文为博主原创,未经允许不得转载: 在开发过程中,经常会使用log记录一下当前请求的参数,过程和结果,以便帮助定位问题.在并发量下的情况下,日志打印不会剧增,可以很快就能通过打印的日志查看执行的情况. ...

  5. Jstack 查看线程状态及定位占用 cpu 较高的 java 线程

    本文为博主原创,未经允许不得转载: 1. Jstack 用来查看 java 指定进程所包含的 java 线程状态:    "arthas-NettyHttpTelnetBootstrap-3 ...

  6. GraduationProject

    GraduationProject 为了毕设寻找的一些springboot项目资源 后台项目: FEBS-Shiro: https://github.com/wuyouzhuguli/FEBS-Shi ...

  7. [转帖]k8s ipv4/ipv6双栈实践

    https://www.iceyao.com.cn/post/2020-11-28-k8s_dual_stack/ Posted by 爱折腾的工程师 on Saturday, November 28 ...

  8. [转帖]Web技术(四):TLS 握手过程与性能优化(TLS 1.2与TLS 1.3对比)

    https://blog.csdn.net/m0_37621078/article/details/106126033?ops_request_misc=%257B%2522request%255Fi ...

  9. [转帖]Windows系统内置测试工具(winsat)

    WinSAT 是 Windows 系统评估工具(Windows System Assessment Tool)的缩写,是从 Windows Vista 开始便内置于系统之中的命令行工具,可对 Wind ...

  10. [转帖]关于F5负载均衡你认识多少?

    https://www.cnblogs.com/xiexun/p/10718348.html 网络负载均衡(load balance),就是将负载(工作任务)进行平衡.分摊到多个操作单元上进行执行,例 ...