delphi 对象赋值与:=

2024-02-05

有人可以解释一下以下之间的区别:

(1.)

newObj := TMyObject.Create;
newObj.Assign(oldObj);

and

(2.)

newObj := oldObj;

2. 确实newObj and oldObj引用同一个对象?

抱歉,如果之前已经介绍过此内容,但很难搜索:=


newObj := TMyObject.Create; 
newObj.Assign(oldObj);

假如说Assign正确实施,这

  • 创建一个新实例TMyObject (via Create)
  • 在变量中存储对该实例的引用newObj(通过:=操作员)
  • 执行深度复制oldObj, 制作newObj功能上完全相同的副本oldObj (via Assign).

这里的最终结果是你有两个完全独立的实例TMyObject此时,它们是彼此的精确副本。


newObj := oldObj;

上面只是复制了一个参考oldObj并将其存储在变量中newObj。在这种情况下,您仍然只有一个实例TMyObject和两个变量newObj and oldObj指向同一个实例。如果您使用任一变量修改该对象的状态,则两个变量都将反映这些更改,因为它们都指向同一基础对象。

这与上面的示例形成鲜明对比,在上面的示例中,您有两个单独的对象,当两个对象独立修改时,它们的状态可能会有所不同。


从概念上讲,对象(类)的变量一般称为“参考类型“。这种类型的变量本质上只是指针(如果这更熟悉的话)。赋值(:=) 引用类型仅复制对对象的引用,而不是对象本身。

唯一的实质性例外是string类型,具有引用类型的许多属性,但由编译器管理,在许多方面也表现为值类型(修改字符串会生成新的修改副本,而不是修改可能在其他地方引用的原始字符串)。

也可以看看 :要从一个对象复制到另一个对象,我可以直接分配变量,还是必须单独分配它们的属性? https://stackoverflow.com/q/24887218/327083

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

delphi 对象赋值与:= 的相关文章

随机推荐