为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

郎朗坤 2021-11-19 15:11:43
使用下面的深度复制代码;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=5myTarget.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的代码)
查看完整描述

2 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

有的时候,创建一个对象可能会非常耗时,比如对象需要从远程数据库中获取数据来填充,又或者创建对象需要读取硬盘文件。此时,如果已经有了一个对象,再创建新对象时,可能会采用复制现有对象的方法,而不是重新建一个新的对象。
浅度复制 和 深度复制 是以如何复制对象的成员(member)来划分的。一个对象的成员有可能是值类型,有可能是引用类型。当我们对对象进行一个浅度复制的时候,对于值类型成员,会复制其本身(值类型变量本身包含了所有数据,复制时进行按位拷贝);对于引用类型成员(注意它会引用另一个对象),仅仅复制引用,而不创建其引用的对象。结果就是:新对象的引用成员和 复制对象的引用成员 指向了同一个对象。

深度复制就是将引用成员指向的对象也进行复制。实际的过程是创建新的引用成员指向的对象,然后复制对象包含的数据。深度复制可能会变得非常复杂,因为引用成员指向的对象可能包含另一个引用类型成员,最简单的例子就是一个线性链表。如果一个对象的成员包含了对于线性链表结构的一个引用,浅度复制 只复制了对头结点的引用,深度复制 则会复制链表本身,并复制每个结点上的数据。

查看完整回答
反对 回复 2021-11-24
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

关键类象内引用浅拷贝保持引用类象内引用深拷贝连引用象起拷贝
比School类边SchoolName校名称teacher象
浅拷贝拷贝SchoolNameteacher前引用象(拷贝象修改teacher值影响象teacher值)深拷贝连teacher拷贝新象前象完全复制修改teacher值影响象teacher值

查看完整回答
反对 回复 2021-11-24
  • 2 回答
  • 0 关注
  • 305 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信