浅复制和深复制

浅复制和深复制其实是对内存的操作,我们先从内存开始吧

 

栈和堆

堆栈都是在内存开辟一块空间,但是本质确不相同

栈:是为线程服务的,一个程序有多个线程且线程是可销毁的,所以栈资源可以看成临时资源

堆:是为进程服务的,一个程序只有唯一一个进程,生产周期和程序同步,所以堆资源可以看成是永久资源

值类型和引用类型

值类型:数值类型和结构体,通常情况,值类型是存放在栈中

引用类型:类和字符串,引用分为两部分,实际资源和资源地址,引用类型的值(实际资源)一定会存放在堆中.谁使用引用类型资源谁存放引用类型地址,可以是栈也可以是堆

浅复制和深复制说明

 

 浅复制:值类型重新复制,引用类型只复制引用地址,不复制堆资源,字符串特殊都会复制.浅复制一个类,新类的值类型和字符串都会重新开辟地址,对新类的值类型和字符串操作不会影响旧类;新类的引用类型只复制地址,和旧类公用一块堆资源,新类操作引用类型,会影响旧类;

深复制:值类型和引用类型都会重新开辟地址,新旧类操作互补影响

代码实例

资源类

 /// <summary>
    /// 资源类
    /// </summary>
   public class ResourceClass
    {
        public int id { get; set; } = 1;
        public string name { get; set; } = "test";
        public ItemClass ItemClass { get; set; } = new ItemClass();

        public void print(string classname) {
            Console.WriteLine($"**********打印的类名称:{classname}*****************");
            Console.WriteLine($"打印类内容:id={id},name={name},age={ItemClass.age},remark={ItemClass.remark}");
            Console.WriteLine($"********************************************");
        }

        /// <summary>
        /// 浅克隆
        /// </summary>
        /// <returns></returns>
        public ResourceClass ShallowClone()
        {
            Console.WriteLine($"**********浅克隆*****************");
            return (ResourceClass)this.MemberwiseClone();

        }
        /// <summary>
        /// 深克隆
        /// </summary>
        /// <returns></returns>
        public ResourceClass DeepClone()
        {
            Console.WriteLine($"**********深克隆*****************");
            ResourceClass ResourceClass=(ResourceClass)this.MemberwiseClone();
            ResourceClass.ItemClass = new ItemClass() {
                age = 30,
                remark = "深克隆"
            };
            return ResourceClass;

        }
    }
    public class ItemClass {
        public int age { get; set; } = 10;
        public string remark { get; set; } = "说明";
    }

操作

static void Main(string[] args)
        {
            ResourceClass resourceClass = new ResourceClass();
            resourceClass.print("resourceClass");
            ResourceClass resourceShallowClass= resourceClass.ShallowClone();
            resourceShallowClass.print("resourceShallowClass");
            ResourceClass resourceDeepClass = resourceClass.DeepClone();
            resourceDeepClass.print("resourceShallowClass");
            Console.WriteLine($"");
            Console.WriteLine($"----------------对浅克隆操作------------------------");
            //对浅克隆操作
            resourceShallowClass.id = 22222;
            resourceShallowClass.name = "浅克隆赋值";
            resourceShallowClass.ItemClass.age = 22;
            resourceShallowClass.ItemClass.remark = "浅克隆包含类操作";
            resourceClass.print("resourceClass");
            resourceShallowClass.print("resourceShallowClass");
            resourceDeepClass.print("resourceShallowClass");
            Console.WriteLine($"");
            Console.WriteLine($"----------------对深克隆操作------------------------");
            //对深克隆操作
            resourceDeepClass.id = 33333;
            resourceDeepClass.name = "深克隆赋值";
            resourceDeepClass.ItemClass.age = 33;
            resourceDeepClass.ItemClass.remark = "深克隆包含类操作";
            resourceClass.print("resourceClass");
            resourceShallowClass.print("resourceShallowClass");
            resourceDeepClass.print("resourceShallowClass");

            Console.ReadLine();

        }

结果

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值