delphi 对象赋值 vs :=
delphi object assign vs :=
谁能解释一下两者之间的区别:
(1.)
newObj := TMyObject.Create;
newObj.Assign(oldObj);
和
(2.)
newObj := oldObj;
在 2. newObj
和 oldObj
指的是同一个对象吗?
抱歉,如果之前已经介绍过但很难搜索 :=
newObj := TMyObject.Create;
newObj.Assign(oldObj);
假设 Assign
正确执行,这个
- 创建
TMyObject
的新实例(通过 Create
)
- 在变量
newObj
中存储对该实例的引用(通过 :=
运算符)
- 执行
oldObj
的深层复制,使 newObj
成为 oldObj
的功能精确副本(通过 Assign
)。
这里的最终结果是您有两个完全独立的 TMyObject
实例,此时它们是彼此的精确副本。
newObj := oldObj;
上面只是简单地复制了一个对oldObj
的引用,并将其存储在变量newObj
中。在这种情况下,您仍然只有一个 TMyObject
实例,并且变量 newObj
和 oldObj
都指向同一个实例。如果您使用任一变量修改该对象的状态,则两者都将反映这些更改,因为它们都指向同一个底层对象。
这与上面的示例形成对比,在上面的示例中,您有两个单独的对象,当两个对象被独立修改时,其状态可能会有所不同。
从概念上讲,对象(类)的变量一般被称为“引用类型”。这种类型的变量本质上只是指针(如果这更熟悉的话)。具有引用类型的赋值 (:=
) 仅复制对对象的引用,而不是对象本身。
唯一的 material 例外是 string
类型,它们具有许多引用类型的属性,但由编译器管理,在许多方面也表现为值类型(修改字符串生成一个新的修改后的副本,而不是修改可能在别处引用的原始字符串)。
另请参阅:To copy from one object to another, can I assign the variables directly, or must I assign their properties individually?
谁能解释一下两者之间的区别:
(1.)
newObj := TMyObject.Create;
newObj.Assign(oldObj);
和
(2.)
newObj := oldObj;
在 2. newObj
和 oldObj
指的是同一个对象吗?
抱歉,如果之前已经介绍过但很难搜索 :=
newObj := TMyObject.Create;
newObj.Assign(oldObj);
假设 Assign
正确执行,这个
- 创建
TMyObject
的新实例(通过Create
) - 在变量
newObj
中存储对该实例的引用(通过:=
运算符) - 执行
oldObj
的深层复制,使newObj
成为oldObj
的功能精确副本(通过Assign
)。
这里的最终结果是您有两个完全独立的 TMyObject
实例,此时它们是彼此的精确副本。
newObj := oldObj;
上面只是简单地复制了一个对oldObj
的引用,并将其存储在变量newObj
中。在这种情况下,您仍然只有一个 TMyObject
实例,并且变量 newObj
和 oldObj
都指向同一个实例。如果您使用任一变量修改该对象的状态,则两者都将反映这些更改,因为它们都指向同一个底层对象。
这与上面的示例形成对比,在上面的示例中,您有两个单独的对象,当两个对象被独立修改时,其状态可能会有所不同。
从概念上讲,对象(类)的变量一般被称为“引用类型”。这种类型的变量本质上只是指针(如果这更熟悉的话)。具有引用类型的赋值 (:=
) 仅复制对对象的引用,而不是对象本身。
唯一的 material 例外是 string
类型,它们具有许多引用类型的属性,但由编译器管理,在许多方面也表现为值类型(修改字符串生成一个新的修改后的副本,而不是修改可能在别处引用的原始字符串)。
另请参阅:To copy from one object to another, can I assign the variables directly, or must I assign their properties individually?