有人可以解释以下两者之间的区别:
(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
(via Assign
)。最终结果是,您拥有两个完全独立的实例,TMyObject
这两个实例彼此完全相同。
newObj := oldObj;
上面的代码只是将引用复制到oldObj
并将其存储在变量中newObj
。在这种情况下,你仍然只有一个实例TMyObject
和两个变量newObj
,并oldObj
指向同一个实例。如果使用任何一个变量修改该对象的状态,由于它们都指向同一基础对象,因此两者都将反映这些更改。
这与上面的示例相反,在上面的示例中,您有两个单独的对象,它们的状态可能会发生变化,因为两个对象都是独立修改的。
从概念上讲,对象(类)的变量通常称为“引用类型”。这种类型的变量实际上只是指针(如果更熟悉的话)。:=
具有引用类型的赋值()仅将引用复制到对象,而不是对象本身。
类型的唯一实质性例外是string
类型,类型具有引用类型的许多属性,但是由编译器管理,它们也可以作为值类型以多种方式起作用(修改字符串会产生新的修改后的副本,而不是修改可能是在其他地方引用)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句