arrays - 数组类型赋值如何工作?

标签 arrays delphi variable-assignment

我有以下代码:

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]);

在这段代码中,只有一个数组。变量ab 都引用该数组的同一个实例。

为了制作动态数组的副本,请使用 Copy来自系统单元的函数。

引用类型的其他示例包括类实例变量、接口(interface)变量、匿名方法和字符串。除了字符串之外,它们的行为都与动态数组类似。

字符串实现写时复制。这意味着,如果一个字符串对象有多个对其的引用,则通过引用进行的修改会导致在修改时生成一份副本。这具有使字符串数据类型在语义上表现得像值类型的效果。实际上,当您对字符串使用赋值时,该赋值在语义上与复制没有什么区别。但作为一种优化,字符串复制的实际实现被推迟到需要时为止。

关于arrays - 数组类型赋值如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27252514/

相关文章:

javascript - 使用 JavaScript 获取元素的串联文本

c# - 如何在 C# 中分配后保留有关对象的信息?

java - 在 Java 中更改数组内的数组元素

android - 如何在android中解析jsonarray中具有相同名称的jsonobjects?

ios - 德尔福 Firemonkey IOS TContextOpenGL.DestroyPixelShader EXC_BAD_ACCESS

Delphi Tstringlist,获取字符串作为带引号、逗号分隔的字符串?

delphi - 是否有一个 DivMod *不*限于单词 (<=65535)?

python - python中的变量赋值查询

java - 带有内部赋值的 While 循环导致检查样式错误

ios - swift3 append 函数在 firebase observeSingleEvent 内部不起作用