欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.NET中深复制与浅复制

程序员文章站 2022-04-11 20:05:13
概述: 在.net里面,提供对象复制的功能,前提是实现icloneable接口。icloneable接口中有一个clone方法, 可以在类中覆写实现自定义的拷贝方法。对象复制的实现...
概述:
在.net里面,提供对象复制的功能,前提是实现icloneable接口。icloneable接口中有一个clone方法,
可以在类中覆写实现自定义的拷贝方法。对象复制的实现方法有两种:深复制和浅复制。

深复制和浅复制:

浅复制,浅复制是指源对象与复制出来的对象共用一份实体,对其中任何一个对象的改动都会影响另外一个对象。相当于复制了指针。
深复制:指源对象与复制对象互相独立,为新对象重新分配了一段内存空间,并复制源对象的内容。其中任何一个对象的改动都不会对另外一个对象造成影响。


深浅复制与数据类型:

memberwiseclone 方法创建当前对象的浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。
如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。对象复制的实现方法有两种:浅复制和浅复制。

c#中有两种类型变量,一种 是值类型变量,一种是引用类型变量(类,接口,数组)。对于前者,复制是属于深复制;而对于后者,一般的复制只是浅复制,相当于只传递一个引用指针一样。因此 对于后者进行真正深复制的时候,也是最费事的,具体的说,必须为其实现icloneable接口中提供的clone方法。

图解:

.NET中深复制与浅复制

代码说明:喎?https: www.2cto.com/kf/ware/vc/"="" target="_blank" class="keylink">vc3ryb25npkmj1tc1xmr91+nkx9l908pqzbxesetbv6oszai5/bbuyv3x6bxeultwxrxe0d3kvqgjwo294snux7o4tnbgoam8l3a+cjxwpsezultwxqo6pgjypgo8l3a+cjxwpjwvcd4kphbyzsbjbgfzcz0="brush:java;">public class shallowcopy : icloneable { public int[] s = { 1,2,3,4 }; public object clone() { return this.memberwiseclone(); } public void display() { foreach (int i in s) { console.write(i + ","); } console.writeline(); } }客户端:(1)

.NET中深复制与浅复制
客户端:(2)

.NET中深复制与浅复制

通过obj1.s[1]=1和obj2.s[2]=1,我们可以看出,浅复制只要任意一个实例化的对象对引用的对象进行修改,都以最后一次的修改为准。


深复制:

 public class deepcopy : icloneable
    {

       public int[] s = { 1, 2, 3, 4};
       public deepcopy()
        {
         }
        private deepcopy(int[] s)
        {
            this.s = (int[])s.clone();
        }
        public object clone()
        {
            // 构造一个新的deepcopy对象
            return new deepcopy(this.s);
        }
        public void display()
        {

            foreach (int i in s)
            {
                console.write(i + ", ");
            }
            console.writeline();
        }
    }
}
客户端:

.NET中深复制与浅复制

深复制实例化的对象如果进行修改如obj1.s[1]=1只是对对象obj1进行了修改,并不影响obj2。


总结:复制功能实现从一个对象在创建另一个可制定的对象,而不需要知道任何创建的细节,我们所学的原型模式就是复制功能的体现。

喎?https:>