全网深拷贝浅拷贝讲的最清楚的文章

什么是深拷贝和浅拷贝?

假如老张需要一台冰箱,于是老张花2000块买了一台冰箱,老张就拥有了一台冰箱,老张往冰箱里面塞满了自己喜欢的东西。有一天老刘说他也需要一台冰箱,老张知道后就把冰箱位置告诉了老刘,于是老刘也有了一台冰箱,老张跟老刘一 起快乐的吃冰箱的东西。我们管老刘获得冰箱的方式叫做浅拷贝。

有一天老张感觉两个人用冰箱太麻烦,于是老张出钱给老刘买了一台冰箱用,于是老刘自己也有了自己的冰箱,这时候他们两个人各自拥有自己的冰箱,这种方式叫做深拷贝。

代码实现

			//冰箱
			public class Bingxiang
		    {
		        private string lengcang;
		
		        public string LengCang
		        {
		            get { return lengcang; }
		            set { lengcang = value; }
		        }
		
		    }
		    
			//老张有一个大冰箱
            Bingxiang laozhang = new Bingxiang();
            //老刘啥也没有
            Bingxiang laoliu;
            //老张把冰箱位置告诉老刘
            laoliu = laozhang;
            //老张老刘一起快乐的使用冰箱
            laoliu.LengCang += "老刘放进去五花肉";
            laozhang.LengCang += " 老张放进去啤酒";

            //看下老张跟老刘冰箱里都有啥
            Console.WriteLine("老张的冰箱:" + laozhang.LengCang);
            Console.WriteLine("老刘的冰箱:" + laoliu.LengCang);
            Console.ReadKey();

发现两个人用的是同一台冰箱!!(浅拷贝)
在这里插入图片描述

所以得出结论自定义类Bingxiang是浅拷贝类型。

			//老张有一个2000块大冰箱
            int laozhang = 2000;
            //老刘啥也没有
            int laoliu;
            //老张花钱给老刘买了新冰箱
            laoliu = laozhang;

            //老张花100块给冰箱加了五花肉
            laozhang += 100;
            //老刘花50块给冰箱加了啤酒
            laoliu += 50;

            //看下老刘跟老张的冰箱都有啥
            Console.WriteLine("老张的冰箱:" + laozhang);
            Console.WriteLine("老刘的冰箱:" + laoliu);
            Console.ReadKey();

发现老张冰箱多了100块的五花肉,老刘冰箱多了50块的啤酒,两个人各用各冰箱,互不干扰!!(深拷贝)
在这里插入图片描述

所以得出结论int类型是深拷贝类型。

深拷贝的实现方式

这时候存在一个问题,假如老刘也想要一个新的Bingxiang类型的冰箱,要怎么处理?

			//老张有一个2000块大冰箱
            Bingxiang laozhang = new Bingxiang();
            //老刘啥也没有
            Bingxiang laoliu;
            //老张花钱给老刘买冰箱
            laoliu = DeepCopy(laozhang);
            //老张老刘分别使用冰箱
            laoliu.LengCang += "老刘放进去五花肉";
            laozhang.LengCang += "老张放进去啤酒";

            //看下老张老刘冰箱都有啥
            Console.WriteLine("老张的冰箱:" + laozhang.LengCang);
            Console.WriteLine("老刘的冰箱:" + laoliu.LengCang);
            Console.ReadKey();

		public static T DeepCopy<T>(T obj)
        {
            object retval;
            using (MemoryStream ms = new MemoryStream())
            {
                DataContractSerializer ser = new DataContractSerializer(typeof(T));
                ser.WriteObject(ms, obj);
                ms.Seek(0, SeekOrigin.Begin);
                retval = ser.ReadObject(ms);
                ms.Close();
            }
            return (T)retval;
        }

发现老张冰箱里只有自己的啤酒,老刘冰箱里只有自己的五花肉。(自定义Bingxiang类实现深拷贝)
在这里插入图片描述

最后老张老刘可以愉快的吃着五花肉喝啤酒了。。。

喜欢的点赞

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值