delphi对象赋值vs:=



有人能解释一下之间的区别吗

(1)

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

(2)

newObj := oldObj;

在2。newObjoldObj指的是同一个对象吗?

很抱歉,如果之前已经报道过,但很难搜索:=

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

假设Assign被正确地实现,这个

  • 创建TMyObject的新实例(通过Create
  • 在变量newObj中存储对该实例的引用(通过:=运算符)
  • 执行oldObj的深度复制,使newObj成为oldObj的功能精确副本(通过Assign

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


newObj := oldObj;

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

这与上面的例子相反,在上面的例子中,有两个单独的对象,当两个对象都被独立修改时,它们的状态可能会发生分歧。


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

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

另请参阅:要从一个对象复制到另一个对象,我可以直接分配变量,还是必须单独分配它们的属性?

相关内容

  • 没有找到相关文章

最新更新