C# 深入理解记录-浅拷贝和深拷贝

一、赋值的操作

1、 例子1-1 引用类型赋值

可以看出赋值并不是深拷贝也不是浅拷贝,赋值只是给引用的对象重新起了个别名,一个改变另一个也会发生改变,因此这里的赋值操作其实复制的是引用,指向的是同一个实例的内存地址

值得注意的是该例子是引用类型的赋值操作。所以它引用的是同一个实例(这里涉及到值类型和引用类型的分配机制)例如: 值类型存储在栈上,引用类型分配在堆上

2、 例子1-2 值类型赋值

由例子代码可见值是分配在不同栈地址上,不同变量的地址也不同,因此这里的示例其实声明了两个不同的值类型变量,因此所指向的栈地址不同,Number 改变值的时候,其实只是改变Number这个值对象的栈地址

二、浅拷贝。值类型成员独立,但是引用类型成员共享。

1、由例子可看出car的值类型成员改变,carCp的值类型成员没有改变


2、由例子2-(2,3)观察car和carCp的引用类型成员都发生了改变,因此引用类型成员引用的其实是同一个地址

例子2-2

例子2-3

三、深拷贝:值类型成员和引用类型成员都是互相独立的,即创建了一个新的对象

例子3-1

例子3-2

从代码可看出,进行深拷贝实现后,类型成员和引用类型成员都是互相独立的,改变其对象值都互相不影响

四、示例代码

    public class Car: ICloneable
    {
        public string Name { get; set; }
        public int type { get; set; }
        public object obj { get; set; }

        public Cat Cat { get; set; }

        /// <summary>
        /// 创建当前浅拷贝副本
        /// </summary>
        /// <returns></returns>
        public object Clone()
        {
            return (Car)this.MemberwiseClone();
        }

        /// <summary>
        /// 深拷贝
        /// </summary>
        /// <param name="car"></param>
        /// <returns></returns>
        public object Clone(Car car)
        {
            //创建对象
            Car NewCar = new Car();
            NewCar.Name = car.Name;
            NewCar.type = car.type;
            NewCar.Cat = new Cat(car.Cat.Name);
            return NewCar;
        }
    }

以上如有不对,请大家纠正,感谢

本文参考和引用LoveMIss-Y 作者的博客,感谢

总结:

1、赋值。赋值和深度复制,浅度复制完全是不同的概念,并没有什么关系,很多文章说赋值对于值类型是深度复制,对于引用类型是浅度复制,这种说法是不正确的,它的本质是在线程栈上产生一样的副本。

2、浅度复制。值类型成员独立,但是引用类型成员共享。

3、深度复制。值类型成员和引用类型成员都是独立的,即完完全全的一个全新的副本,称之为深度复制。

原文链接:一文搞懂C#中的赋值、深复制、浅复制_LoveMIss-Y的博客-CSDN博客

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值