delphi 对象分配 vs :=

Posted

技术标签:

【中文标题】delphi 对象分配 vs :=【英文标题】:delphi object assign vs := 【发布时间】:2016-04-01 14:14:13 【问题描述】:

谁能解释一下两者的区别:

(1.)

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

(2.)

newObj := oldObj;

在 2. newObjoldObj 是否引用同一个对象?

对不起,如果之前已经介绍过但很难搜索:=

【问题讨论】:

请注意,TObject 没有Assign 方法,只有TPersistent 有。 TPersistent.Assign 的描述谈到了“相似”的对象。文件和合同在这里有点模糊。 【参考方案1】:
newObj := TMyObject.Create; 
newObj.Assign(oldObj);

假设Assign被正确实现,这个

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

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


newObj := oldObj;

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

这与上面的示例相反,在上面的示例中,您有两个单独的对象,它们的状态可能会随着两个对象的独立修改而不同。


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

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

另请参阅:To copy from one object to another, can I assign the variables directly, or must I assign their properties individually?

【讨论】:

字符串不是在赋值下复制,而是增加内部实例引用计数器;与动态数组和(默认)接口相同。 @user246408 但值得补充的是:如果以某种方式更改了 refcount>1 的字符串,它最后会被复制,所以我们最后会得到 2 个单独的字符串,所以它的行为就像我们从一开始就有 2 个独立的字符串。

以上是关于delphi 对象分配 vs :=的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Delphi 6 对象中获取类以分配给元类变量?

Delphi的对象注销方法Destroy和free

另一个对象中的对象不在单元之间保持不变 Delphi

Javascript Intellisense 不再适用于在 Visual Studio 2022 中创建初始对象后分配的对象属性

C++ New vs Malloc 用于对象的动态内存数组

Java堆空间Vs栈内存