可以帮忙解释一下,C#关于深度复制的问题吗?具体代码如下

使用下面的深度复制代码;
public class Content
{
public int Val;
}

public class Cloner:ICloneable
{
public Content MyContent=new Content();

public Cloner(int newVal)
{
MyContent.Val=newVal;
}

public object Clone()
{
Cloner clonerCloner=new Cloner(MyContent.Val);
return clonerCloner;
}
}
其中使用包含在源Cloner对象中的Content对象(MyContent)的Val字段,创建一个新Cloner对象。这个字段是一个值类型,所以不需要深度复制
使用下面的代码测试:
Cloner mySource = new Cloner(5);
Cloner mytarget = (Cloner)mySource.GetCopy();
Console.WriteLine("myTarget.MyContent.Val={0}", mytarget.MyContent.Val);
mySource.MyContent.Val = 2;
Console.WriteLine("myTarget.MyContent.Val={0}", mytarget.MyContent.Val);
得到如下结果:
myTarget.MyContent.Val=5
myTarget.MyContent.Val=5
这次包含的对象是独立的。注意有时在比较复杂的对象系统中,调用Clone()是一个递归过程。如,如果Cloner类的MyContent字段也需要深度复制,就要使用下面的代码:
(这句话要怎么理解,Cloner类的MyContent字段也需要深度复制,上面不是已经对MyContent进行了深度复制么,为什么调用Clone()是一个递归过程?)
public class Cloner:ICloneable
{
public Content MyContent=new Content();

...

public object Clone()
{
Cloner clonerCloner=new Cloner();
clonerCloner.MyContent=MyContent.Clone();
return clonerCloner;
}
}
这里调用了默认的构造函数,以便简化创建一个新Cloner对象的语法。为使这段代码能正常工作,还需要在Content类上实现ICloneable接口(能否帮忙给出在Content类上实现IConeable的代码)

郎朗坤
浏览 316回答 2
2回答

慕标5832272

有的时候,创建一个对象可能会非常耗时,比如对象需要从远程数据库中获取数据来填充,又或者创建对象需要读取硬盘文件。此时,如果已经有了一个对象,再创建新对象时,可能会采用复制现有对象的方法,而不是重新建一个新的对象。浅度复制 和 深度复制 是以如何复制对象的成员(member)来划分的。一个对象的成员有可能是值类型,有可能是引用类型。当我们对对象进行一个浅度复制的时候,对于值类型成员,会复制其本身(值类型变量本身包含了所有数据,复制时进行按位拷贝);对于引用类型成员(注意它会引用另一个对象),仅仅复制引用,而不创建其引用的对象。结果就是:新对象的引用成员和 复制对象的引用成员 指向了同一个对象。深度复制就是将引用成员指向的对象也进行复制。实际的过程是创建新的引用成员指向的对象,然后复制对象包含的数据。深度复制可能会变得非常复杂,因为引用成员指向的对象可能包含另一个引用类型成员,最简单的例子就是一个线性链表。如果一个对象的成员包含了对于线性链表结构的一个引用,浅度复制 只复制了对头结点的引用,深度复制 则会复制链表本身,并复制每个结点上的数据。

一只甜甜圈

关键类象内引用浅拷贝保持引用类象内引用深拷贝连引用象起拷贝比School类边SchoolName校名称teacher象浅拷贝拷贝SchoolNameteacher前引用象(拷贝象修改teacher值影响象teacher值)深拷贝连teacher拷贝新象前象完全复制修改teacher值影响象teacher值
打开App,查看更多内容
随时随地看视频慕课网APP