C#深拷贝和浅拷贝问题

时间:2021-05-19 19:46:27
请问;
深拷贝和浅拷贝我是这样理解的:
值类型只能进行浅拷贝 原始对象和副本共用同一对象 值也相同
引用类型可以进行深拷贝和浅拷贝 要深拷贝必须实现ICloneable接口 深拷贝后 原始对象和副本是两个不同的对象 只是它们的值相同
可以这样理解吗

14 个解决方案

#1


1、值类型有深、浅拷贝之分吗?!

“值类型只能进行浅拷贝   原始对象和副本共用同一对象   值也相同”
  这个说法有点问题。

2、深、浅拷贝我一直用C++的指针来理解。
   区别在于拷贝的是指针指向的对象,还是只拷贝指针本身。

#2


学习

#3


2.同意樓主觀點。淺拷貝隻拷貝了引用,共用了所指向的數據;深拷貝相當於完全復制了一份,包括指向的數據

#4


这个还有什么疑问吗

#5


值类型只能深拷贝吧?因为本身没有引用调用,所有操作都与原对象无关.
而深拷贝也不一定必须实现ICloneable接口,具体算法的实现与继承关系是无关的

#6


值类型只能进行深拷贝
应用类型的拷贝与实现ICloneable接口没有关系,你完全可以自己写一个叫Clone的方法,但是实现ICloneable接口是有意义的。
深拷贝会把对象内部的引用类型的对象也克隆一份,浅拷贝不会
比如你克隆一辆汽车,浅拷贝的话两量汽车会共享4个*,深拷贝的话就会各自拥有独立的*

#7


浅拷贝(shallow copy)是指当对象的字段值被拷贝时,字段引用的对象不会被拷贝,这样,当拷贝完毕后,源对象和拷贝对象的字段会引用同一个值。
深拷贝(deep copy)是对对象实例中字段引用的对象也进行拷贝的一种方式,这样,新对象将引用新的字符串。需要注意的是,执行深拷贝后,源对象和拷贝对象不会共享任何东西,改变一个对象对另一个对象没有任何影响。

#8


感觉和当前学习值调用和引用调用差不多的理解方式,只不过多出了2个名词解释。

#9


 要深拷贝必须实现ICloneable接口   深拷贝后   原始对象和副本是两个不同的对象   只是它们的值相同 
可以这样理解吗

可以.

#10


可以这样理解! 但是千万注意, ICloneable接口实现后资源占用和时间消耗都在延长, 除了必须使用大量不同类副本的自动生成情况下以外, 建议使用其它方法替代.

#11


keyi

#12


study

#13


ICloneable.Clone 方法

返回值
作为此实例副本的新对象。

备注
Clone 既可作为深层副本实现,也可作为浅表副本实现。在深层副本中,所有的对象都是重复的;而在浅表副本中,只有*对象是重复的,并且*以下的对象包含引用。结果克隆必须与原始实例具有相同的类型或是原始实例的兼容类型。



以上是MSDN的解释。深拷贝不一定要实现ICloneable接口。有些类型的Clone方法提供的是浅拷贝。比如Arrary,ArraryList实现的就是浅拷贝。
如果想使用深拷贝,可以自己写一个方法。但深拷贝代价比较大。

#14


对于实现了ICloneable接口的系统类型
可以通过递归和反序列化(类型要继承了此接口)的方法来自己实现深拷贝

而对于自定义类型,则通过继承ICloneable接口的Clone方法,并重写Clone方法来自己实现

#1


1、值类型有深、浅拷贝之分吗?!

“值类型只能进行浅拷贝   原始对象和副本共用同一对象   值也相同”
  这个说法有点问题。

2、深、浅拷贝我一直用C++的指针来理解。
   区别在于拷贝的是指针指向的对象,还是只拷贝指针本身。

#2


学习

#3


2.同意樓主觀點。淺拷貝隻拷貝了引用,共用了所指向的數據;深拷貝相當於完全復制了一份,包括指向的數據

#4


这个还有什么疑问吗

#5


值类型只能深拷贝吧?因为本身没有引用调用,所有操作都与原对象无关.
而深拷贝也不一定必须实现ICloneable接口,具体算法的实现与继承关系是无关的

#6


值类型只能进行深拷贝
应用类型的拷贝与实现ICloneable接口没有关系,你完全可以自己写一个叫Clone的方法,但是实现ICloneable接口是有意义的。
深拷贝会把对象内部的引用类型的对象也克隆一份,浅拷贝不会
比如你克隆一辆汽车,浅拷贝的话两量汽车会共享4个*,深拷贝的话就会各自拥有独立的*

#7


浅拷贝(shallow copy)是指当对象的字段值被拷贝时,字段引用的对象不会被拷贝,这样,当拷贝完毕后,源对象和拷贝对象的字段会引用同一个值。
深拷贝(deep copy)是对对象实例中字段引用的对象也进行拷贝的一种方式,这样,新对象将引用新的字符串。需要注意的是,执行深拷贝后,源对象和拷贝对象不会共享任何东西,改变一个对象对另一个对象没有任何影响。

#8


感觉和当前学习值调用和引用调用差不多的理解方式,只不过多出了2个名词解释。

#9


 要深拷贝必须实现ICloneable接口   深拷贝后   原始对象和副本是两个不同的对象   只是它们的值相同 
可以这样理解吗

可以.

#10


可以这样理解! 但是千万注意, ICloneable接口实现后资源占用和时间消耗都在延长, 除了必须使用大量不同类副本的自动生成情况下以外, 建议使用其它方法替代.

#11


keyi

#12


study

#13


ICloneable.Clone 方法

返回值
作为此实例副本的新对象。

备注
Clone 既可作为深层副本实现,也可作为浅表副本实现。在深层副本中,所有的对象都是重复的;而在浅表副本中,只有*对象是重复的,并且*以下的对象包含引用。结果克隆必须与原始实例具有相同的类型或是原始实例的兼容类型。



以上是MSDN的解释。深拷贝不一定要实现ICloneable接口。有些类型的Clone方法提供的是浅拷贝。比如Arrary,ArraryList实现的就是浅拷贝。
如果想使用深拷贝,可以自己写一个方法。但深拷贝代价比较大。

#14


对于实现了ICloneable接口的系统类型
可以通过递归和反序列化(类型要继承了此接口)的方法来自己实现深拷贝

而对于自定义类型,则通过继承ICloneable接口的Clone方法,并重写Clone方法来自己实现