- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
System.Types
单元声明一个数组类型:
TDoubleDynArray = array of Double;
如果我将方法声明为:
procedure func (x : TDoubleDynArray)
我注意到参数 x
的作用类似于 var
参数,即我可以在方法内更改 x
并且我会看到更改反射(reflect)在方法外部。
但是当我使用时
procedure func (x : array of double)
正如预期的那样,x
中的任何更改都保留在 func
中。尽管TDoubleDynArray
似乎被声明为double 数组
,但它的行为与我自己的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.
最佳答案
procedure func1 (x : TDoubleDynArray);
函数参数是 dynamic array 。那是一个引用类型。这意味着函数参数 x 是对数组的引用。其结果是,对 func1
内数组元素的更改会更改调用者的数组。
procedure func2 (y : array of double);
函数参数是 open array parameter 。尽管它重载了 array of
语法,但它与动态数组完全不同。因为这个开放数组是按值传递的,所以数组的副本会传递给函数,因此函数所做的修改对调用者来说是不可见的。
值得指出的是,因为您按值传递了y
,所以传递了数组的副本。这是低效的,对于较大的阵列更是如此。通常,应避免按值开放数组。使用 var
或 const
开放数组参数。同样的建议也适用于其他大型类型,例如固定长度数组和记录。
开放数组参数是无穷无尽的困惑源。我建议您阅读我链接到的文档以及 Rudy 关于该主题的文章:Open array parameters and array of const .
关于delphi - "array of double"和 TDoubleDynArray 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32595652/
System.Types 单元声明一个数组类型: TDoubleDynArray = array of Double; 如果我将方法声明为: procedure func (x : TDoubleD
我是一名优秀的程序员,十分优秀!