delphi对象分配vs:=

use*_*756 9 delphi object variable-assignment colon-equals

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

(1.)

newObj := TMyObject.Create;
newObj.Assign(oldObj);
Run Code Online (Sandbox Code Playgroud)

(2)

newObj := oldObj;
Run Code Online (Sandbox Code Playgroud)

2. newObj并且oldObj指的是同一个对象?

很抱歉,如果之前已经涉及但很难搜索 :=

J..*_*... 8

newObj := TMyObject.Create; 
newObj.Assign(oldObj);
Run Code Online (Sandbox Code Playgroud)

假设这Assign是正确实现的,这个

  • 创建TMyObject(via Create)的新实例
  • 在变量中存储对该实例的引用newObj(通过:=运算符)
  • 执行深层复制oldObj,制作newObj功能完整的oldObj(via Assign)副本.

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


newObj := oldObj;
Run Code Online (Sandbox Code Playgroud)

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

这与上面的示例形成对比,在上面的示例中,您有两个独立的对象,其状态可以分开,因为两个对象都是独立修改的.


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

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

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

  • @user246408但值得补充的是:如果 refcount>1 的字符串以某种方式更改,它最后会被复制,所以我们最后得到 2 个单独的字符串,所以它的行为就像我们从一开始就有 2 个独立的字符串一样。 (2认同)