我有以下代码:
type
PSuperListItem = ^TSuperListItem;
TSuperListItem = record
SubItems : array of String;
Marked : Boolean;
ImageIndex: Integer;
end;
TSuperListItems = array of PSuperListItem;
TMyList = class(TCustomControl)
public
Items, ItemsX : TSuperListItems;
procedure SwapItemLists;
end;
procedure TMyList.SwapItemLists;
var tmp:TSuperListItems;
begin
tmp:=Items; Items:=ItemsX; ItemsX:=tmp;
end;
我想知道我是否正确完成了 SwapItemLists
的分配。当我将 Items
分配给 tmp
时会发生什么?将创建 Items
的新副本,还是仅传递该变量的指针?
最佳答案
动态数组是引用类型。这意味着您只是交换了引用。不会复制数组的内容。
能够自己回答此类问题的关键是理解引用类型的含义。对于动态数组,动态数组类型的变量保存对数组的引用。这是通过动态数组变量作为指向数组的指针在幕后实现的。
考虑这段代码:
var
a, b: TArray<Integer>;
....
a := TArray<Integer>.Create(42);
b := a;
b[0] := 666;
Assert(a[0] = 666);
Assert(@a[0] = @b[0]);
在这段代码中,只有一个数组。变量a
和b
都引用该数组的同一个实例。
为了制作动态数组的副本,请使用 Copy
来自系统
单元的函数。
引用类型的其他示例包括类实例变量、接口(interface)变量、匿名方法和字符串。除了字符串之外,它们的行为都与动态数组类似。
字符串实现写时复制。这意味着,如果一个字符串对象有多个对其的引用,则通过引用进行的修改会导致在修改时生成一份副本。这具有使字符串数据类型在语义上表现得像值类型的效果。实际上,当您对字符串使用赋值时,该赋值在语义上与复制没有什么区别。但作为一种优化,字符串复制的实际实现被推迟到需要时为止。
关于arrays - 数组类型赋值如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27252514/