delphi对象分配vs:=

用户名

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

(1.)

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

(2.)

newObj := oldObj;

在第2不newObjoldObj指代相同的单个对象?

抱歉,如果以前已经解决过,但是很难搜索 :=

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

假设Assign正确实施,这

  • 创建TMyObject(通过Create的新实例
  • 将对该实例的引用存储在变量中newObj(通过:=运算符)
  • 执行的深层副本oldObjnewObj在功能上精确复制oldObj(via Assign)。

最终结果是,您拥有两个完全独立的实例,TMyObject两个实例彼此完全相同。


newObj := oldObj;

上面的代码只是将引用复制到oldObj并将其存储在变量中newObj在这种情况下,你仍然只有一个实例TMyObject和两个变量newObj,并oldObj指向同一个实例。如果使用任何一个变量修改该对象的状态,由于它们都指向同一基础对象,因此两者都将反映这些更改。

这与上面的示例相反,在上面的示例中,您有两个单独的对象,它们的状态可能会发生变化,因为两个对象都是独立修改的。


从概念上讲,对象(类)的变量通常称为“引用类型”。这种类型的变量实际上只是指针(如果更熟悉的话)。:=具有引用类型的赋值()仅将引用复制到对象,而不是对象本身。

类型的唯一实质性例外是string类型,类型具有引用类型的许多属性,但是由编译器管理,它们也可以作为值类型以多种方式起作用(修改字符串会产生新的修改后的副本,而不是修改可能是在其他地方引用)。

另请参见:要从一个对象复制到另一个对象,可以直接分配变量,还是必须分别分配变量的属性?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章