浅表副本是创建一个新的对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一对象。这是【MSDN】对浅表副本的解释,当初才看到的时候没有想明白,最后看了很多人的解释才弄懂。
首先是创建了一个新的对象,也就意味着新创建的对象和原来的对象是两个实例。
但是并不代表着其中一个改变不会对其他的有影响。
回到定义中,如果字段是值类型,则对字段执行逐位复制,在这要说一点关于string类型,虽然是引用类型但是却是一个拥有值类型特点的特殊引用类型,也就是说这里暂且把string当做值类型来看待,值类型的特点是比如说int a = 0;int b = a;这里的a、b的值都为0,这时候改变a的值a = 1;那么现在a得值为1,b的值还是为0,而引用类型则不同,如果用刚才的方法套在引用类型身上,当a改变的时候b也会跟着改变,也就是说当要复制的对象中有真正的引用类型时,就会出现这种结果。
‘复制的是引用但不复制引用的对象’,这句话的意思是只是单单的把对象的引用(地址)给复制过来了,而不是把要复制的对象也给复制了一个出来,这就意味着,一但任意一个浅表副本(或本尊)改变了引用类型的值,那么其余的所有人的这个引用类型都会改变(不懂的可以了解一下值传递和引用(地址)传递的区别)。
如果说你是希望就真真的是复制一个出来,引用类型也是对象和引用都复制话可以去了解一下‘深复制’
最后说一下‘浅复制’(浅表副本)的实现
C#中提供了对应的接口
public interface ICloneable
{
//
// 摘要:
// 创建作为当前实例副本的新对象。
//
// 返回结果:
// 作为此实例副本的新对象。
object Clone();
}
class Resume : ICloneable
{
public object Clone()
{
return (object)this.MemberwiseClone();
}
}
MemberwiseClone这个方法就是功能实现的核心