使用方法在 C# 中进行深度复制

问题描述 投票:0回答:3

我有课:

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 字段是引用类型..它仍然具有相同的引用权吗?我假设深拷贝不会在这里发生)?

c# deep-copy
3个回答
2
投票

在您的示例中,您的

c1
对象是堆上的一个对象。它有一个指向堆上第二个对象 (
c1.aco
) 的指针。在您特定的深拷贝实现中,您正在创建一个新对象
c2
。这将是堆上的一个单独对象,但在这种情况下,其
aco
属性仍将指向原始
aco
对象(例如,
c1.aco == c2.aco
)。我认为您当前的实现介于浅拷贝和真正的深拷贝之间(尽管基于其他评论,似乎不一定同意这种观点)。

我不明白你问题的第二部分 - 我不是 CPP 专家,但我不熟悉

getObjId()
方法,谷歌也没有为我找到太多。您能否详细说明
objId
的意思,也许您想用它做什么?


1
投票

aco 字段是引用类型..它仍然具有相同的引用权限吗? 我假设这里不会发生深拷贝)

是的,这就是引用类型的意义所在,因此您的

aco
-
c1
c2
的属性将引用完全相同的对象。

A deep copy,顾名思义,将创建一个全新的实例down the entire oject-graph。因此,当您的

ComplexObject
中有一些
anotherConplexObject
时,您也应该对其进行深度复制,直到最原子的数据结构,最终将成为值类型和字符串。

根据ypur的第二个问题:我不知道任何对象的任何全局函数

getObjId
返回对象id,因为并非所有类都共享id的概念。您大概的意思是指针address,这是对象的物理存储位置。不过,这个概念与 id 无关。


1
投票

看这两篇文章:

  1. 如何在 .NET 中进行对象的深拷贝?
  2. 深度克隆对象

快乐的编码!

© www.soinside.com 2019 - 2024. All rights reserved.