我有课:
public class ComplexObject
{
public int number = 12;
public anotherComplexObject aco;
}
public class Experiment
{
public ComplexObject GetDeepCopyObj(ComplexObject obj)
{
var copiedData = new ComplexObject
{
number = obj.number,
aco = obj.aco
};
return copiedData ;
}
static void Main()
{
ComplexObject c1 = new ComplexObject();
c1.number = 3;
c1.aco = new anotherComplexObject{...};
Experiment experiment = new Experiment();
ComplexObject c2 = experiment.GetDeepCopyObj(c1); //line 99
}
}
在这里,当我在“第 99 行”中调用 GetDeepCopyObj(c1) 时,c2 将是 c# 中 c1 的深度复制对象(aco 字段是引用类型..它仍然具有相同的引用权吗?我假设深拷贝不会在这里发生)?
在您的示例中,您的
c1
对象是堆上的一个对象。它有一个指向堆上第二个对象 (c1.aco
) 的指针。在您特定的深拷贝实现中,您正在创建一个新对象c2
。这将是堆上的一个单独对象,但在这种情况下,其aco
属性仍将指向原始aco
对象(例如,c1.aco == c2.aco
)。我认为您当前的实现介于浅拷贝和真正的深拷贝之间(尽管基于其他评论,似乎不一定同意这种观点)。
我不明白你问题的第二部分 - 我不是 CPP 专家,但我不熟悉
getObjId()
方法,谷歌也没有为我找到太多。您能否详细说明objId
的意思,也许您想用它做什么?
aco 字段是引用类型..它仍然具有相同的引用权限吗? 我假设这里不会发生深拷贝)
是的,这就是引用类型的意义所在,因此您的
aco
-c1
和c2
的属性将引用完全相同的对象。
A deep copy,顾名思义,将创建一个全新的实例down the entire oject-graph。因此,当您的
ComplexObject
中有一些 anotherConplexObject
时,您也应该对其进行深度复制,直到最原子的数据结构,最终将成为值类型和字符串。
根据ypur的第二个问题:我不知道任何对象的任何全局函数
getObjId
返回对象id,因为并非所有类都共享id的概念。您大概的意思是指针address,这是对象的物理存储位置。不过,这个概念与 id 无关。