关于浅表副本的浅谈

浅表副本是创建一个新的对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一对象。这是【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这个方法就是功能实现的核心

猜你喜欢

转载自blog.csdn.net/Marccco/article/details/84383360