"double of double"和TDoubleDynArray之间的区别

rho*_*ody 4 delphi

System.Types单元声明一个数组类型:

TDoubleDynArray  = array of Double;
Run Code Online (Sandbox Code Playgroud)

如果我将方法声明为:

procedure func (x : TDoubleDynArray)
Run Code Online (Sandbox Code Playgroud)

我注意到参数x就像一个var参数,即我可以x在方法内部进行更改,我会看到更改反映在方法之外.

但是当我使用时

procedure func (x : array of double)
Run Code Online (Sandbox Code Playgroud)

正如所料,任何x入住的变化func.虽然TDoubleDynArray似乎被宣布为一个array of double,但它的行为与我自己的不同array of double.对此有何解释?

更新:我注意到,如果我声明自己的类型,TMyArray = array of double那么我会得到相同的行为TDynamicDynArray.这与基本数组类型之间的区别有关吗?

测试代码如下

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses System.Types;

var
   x : TDoubleDynArray;
   y : array of double;

procedure func1 (x : TDoubleDynArray);
begin
  x[0] := -999.123;
end;

procedure func2 (y : array of double);
begin
  y[0] := -999.123;
end;

begin
    setLength (x, 10);
    func1 (x);
    writeln ('TDoubleDynArray: ', x[0]);

    setLength (y, 10);
    y[0] := 0;
    func2 (y);
    writeln ('array of double: ', y[0]);

    Readln;
end.
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 7

procedure func1 (x : TDoubleDynArray);
Run Code Online (Sandbox Code Playgroud)

function参数是一个动态数组.这是一种参考类型.这意味着函数参数x是对数组的引用.其结果是对内部数组元素的func1更改会更改调用者的数组.

procedure func2 (y : array of double);
Run Code Online (Sandbox Code Playgroud)

function参数是一个开放数组参数.虽然它重载了array of语法,但它与动态数组完全不同.因为这个open数组是按值传递的,所以数组的副本被传递给函数,因此函数所做的修改对调用者是不可见的.

值得指出的是,因为您通过y值传递,所以传递了数组的副本.这是低效的,对于更大的阵列更是如此.通常,应该避免使用值开放数组.使用任一varconst开放数组参数.相同的建议适用于其他大型类型,如固定长度数组和记录.

打开数组参数是一个无尽的混乱源.我建议你阅读我链接到的文档,以及Rudy关于这个主题的文章:打开数组参数和const数组.