" double"数组之间的区别和TDoubleDynArray

时间:2015-09-15 21:07:32

标签: delphi

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

TDoubleDynArray  = array of Double;

如果我将方法声明为:

procedure func (x : TDoubleDynArray)

我注意到参数x就像一个var参数,即我可以在方法中更改x,并且我会看到在方法之外反映的更改。 / p>

但是当我使用

procedure func (x : array of double)

正如预期的那样,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.

1 个答案:

答案 0 :(得分:6)

procedure func1 (x : TDoubleDynArray);

函数参数是dynamic array。这是一种参考类型。这意味着函数参数x是对数组的引用。这样做的结果是对func1内部数组元素的更改会改变调用者的数组。

procedure func2 (y : array of double);

函数参数是open array parameter。虽然它会使array of语法重载,但它与动态数组完全不同。因为这个open数组是按值传递的,所以数组的副本会传递给函数,因此调用者看不到函数所做的修改。

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

打开数组参数是一个无尽的混乱源。我建议您阅读我链接的文档,以及Rudy关于该主题的文章:Open array parameters and array of const