A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑根旺 中级黑马   /  2012-9-18 09:57  /  2244 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

C# 中深度复制与浅度复制的区别

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

4 个回复

倒序浏览
浅拷贝
    DemoClass dclass3=dclass1.copy();
       复制dclass1的除引用成员外的所有成员。即假设DemoClass类里有一个成员是
    private AnotherClass aclass=new AnotherClass();
       执行浅拷贝时,dclass3的aclass成员还是引用的dclass1的aclass.
深拷贝
    这下你明白了,
    DemoClass dclass4=dclass1.deepcopy();
       dclass4会得到所有dclass1的引用成员和成员的副本。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
有时我们会根据一个对象来创建另外一个对象,也就是复制,但是复制也还是要分浅度复制和深度复制。
浅度复制和深度复制的差别在于引用类型上:
浅度复制会复制源对象的所有值类型,但是你所创建的这个对象和源对象中的引用类型成员是同一个对象,因此无论是在你所创建的这个对象还是在源对象中改变这个引用类型的对象的值,另外一个对象中的这个引用类型对象的值也会发生改变。
深度复制不单单会复制源对象中的值类型的成员而且还会完全复制一份新的引用类型的对象,因此无论是在你所创建的这个对象还是在源对象中改变这个引用类型的对象的值,另外一个对象的这个引用类型的对象的值不会受到影响。
浅度复制可以直接调用System.Object.MemberwiseClone()这个受保护的方法就可以了。
而深度引用根据C#的规范实现ICloneable接口即可。

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
类中包含引用对象时,就要考虑复制该类时,是采用深度复制还是浅度复制了.

浅度复制的结果是,新对像是包含的引用对象   和   原对象中包含的引用对象是同一个东东,   改变其中任何一个中所引用的那个对象,   另一个也会受到影响;

深度复制的结果,与之相反,   新对象与原对象是完全独立的,   改变其中任何一个所包含的引用对像,   另一个都不会受到影响;

关键是要理解对象中包含引用对象的概念.

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
浅度复制是对对象的值类型成员进行复制,对于对象体内的引用类型,如果使用浅度复制,其复制的是一个引用,复制后的对象保持和原对象一样的引用;如果是深度复制,会创建和原对象彼此独立的成员。
结合代码看看
class Program
    {
        public class Jasson //此处定义一个引用类型
        {
            public int F=4;
        }
// 定义一个用于测试浅度和深度复制的类
public class Jassoner : ICloneable //继承标准接口
        {
            public int C=19; //值类型,所以不管是深度还是浅度,被复制对象该值改变不会影响复制对象值的变化
            public Jasson Hello = new Jasson();//引用类型,
            public object Getcopy() //浅度复制函数
            {
                return MemberwiseClone();
            }
            public object Clone() //深度复制函数
            {
                Jassoner Nihao = new Jassoner();
                return Nihao;
            }
        }
   
        static void Main(string[] args) //测试效果
        {
            Jassoner Copy = new Jassoner(); //产生被复制对象
            Copy.Hello.F = 20; //对被复制对象中的引用类型成员内的成员赋值
            Jassoner Sender = (Jassoner)Copy.Getcopy(); //进行浅度复制
            Console.WriteLine("{0}", Sender.Hello.F
            Copy.Hello.F = 10;                  
            Console.WriteLine("{0}", Sender.Hello.F);
            Jassoner Good = (Jassoner)Copy.Clone();//进行深度复制
            Console.WriteLine("{0}", Good.Hello.F);//复制成独立的对象
            Copy.Hello.F = 11;
            Console.WriteLine("{0}", Good.Hello.F); //被复制对象引用类型成员内部成员发生改变,不影响复制对象,结果还是4
  //当然对于被复制对象内部的值类型成员,不管是深度复制还是浅度复制都产生的是独立的对象;
            Copy.C = 14;
            Console.WriteLine("{0}", Sender.C);//结果仍然是19
            Console.WriteLine("{0}", Good.C););//结果仍然是19
            Console.ReadKey();      
        }
    }
}
结果如下:
20
10
4
4
19
19

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马