首页 > 其他分享 >delphi 里 多用TArray 而不是 array of

delphi 里 多用TArray 而不是 array of

时间:2024-02-03 16:45:46浏览次数:29  
标签:end delphi TArray Delphi 数组 array Create

今天写代码发现个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 和逐个元素的赋值操作。

标签:end,delphi,TArray,Delphi,数组,array,Create
From: https://www.cnblogs.com/del88/p/18004904

相关文章

  • delphi TThread.WaitFor 用法
    在Delphi中,TThread.WaitFor方法用于等待一个线程完成执行。当你创建一个线程并希望主线程(或其他线程)等待这个线程结束时,你可以使用这个方法。以下是TThread.WaitFor方法的基本用法:创建一个线程类:首先,你需要从TThread派生一个类,并重写其Execute方法。这个方法是你线程......
  • Laravel中toArray()方法使用驼峰变量
    前言不知道大家在用Laravel开发过程中有没有遇到过模型查询时,with中使用驼峰命名变量名,但是使用toArray方法后,变量名变成了蛇形命名;比如说这样的一条查询语句:WorkflowModel::query()->with(['workflowsInfo'])->get()->toArray();查询出来的结果可能就是这样的:查询出来关联......
  • [LeetCode] 2966. Divide Array Into Arrays With Max Difference
    Youaregivenanintegerarraynumsofsizenandapositiveintegerk.Dividethearrayintooneormorearraysofsize3satisfyingthefollowingconditions:Eachelementofnumsshouldbeinexactlyonearray.Thedifferencebetweenanytwoelementsin......
  • ArrayList的扩容机制详解,解决面试难题!
    前言大家好,我是chowley,不知各位在面试中,是否被问过‘读没读过相关框架的源码?’这个经典问题?我最近就遇到了,虽然我之前读过,但这玩意干读不进味啊今天我就来讲讲ArrayList,这个白家长谈的经典数据结构的扩容机制!ArrayList在Java的集合框架中,ArrayList是一个非常常用的动态数组实......
  • ArrayBlockingQueue使用
    packageorg.example;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.ArrayBlockingQueue;/***用数组实现的阻塞队列*/publicclassArrayBlockingQueueDemo{ArrayBlockingQueuequeue=newArrayBlockingQueue(3);volat......
  • niushop单商户v5多店版升级到v5.3后商业插件报错问题综合解决方式variable type error
    大家可能像我一样遇到一个奇葩问题就是,niushop系统从5.2内核升级到5.3后所有的插件都不能正常使用了,特别是第三方的商业插件,官方给的说法是要重新适配,这个需要较多时间,不过我总结了一下自己就可以修复比如以下插件会遇到这种问题!niushop支付宝小程序插件niushop阿里云插件niushop......
  • 关于pycharm报错:Original error was: DLL load failed while importing _multiarray_u
    前提:遇到该问题时,已重新卸载并安装numpy,但由于今日重新打开pycharm,运行相同的代码,又再次报错,故重新寻找了新的方式进行尝试。原文地址解决方法:Step1:点击run,找到EditConfigurationsStep2:在EnvironmentVariables后加入:Path=Anaconda根目录\Library\bin......
  • delphi中的Format、FormatDateTime函数详解(转)
    Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮助进行一些翻译,让它有一个完整的概貌,以供大家查询之用:首先看它的声明:functionFormat(constFormat:string;constArgs:arrayofconst):string;overload;事实上Format方法有两个种形式,另外一种是三个参数的,......
  • CF1904C Array Game
    题目传送门codeforces洛谷题目大意给你一个由\(n\)个正整数组成的数组\(a\)。在一次操作中,选取\((i,j)\),将\(|a_i-a_j|\)加到\(a\)的末尾。你的任务是在执行\(k\)操作后,最小化最后数组\(a\)的最小值。思路分三种情况:\(k\geq3\)时,我们可以取两次相同......
  • ArrayList 扩容规则和 fail-fast 和fail-sale
    初始长度为0数组ArrayList()会使用长度为0的数组ArrayList(intinitalCapacity)会使用自定容器的数组 如果初始不是0add()首次扩容为10,再次扩容为1.5倍addAll()会在元素与下次扩容1.5倍选最大值 Iterator(迭代器)遍历集合遍历set集合,遍历list集合,编辑map集合fail......