C#原型模式 (深拷贝,浅拷贝)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace PrototypePattern
{
    internal class Program
    {
        static void Main(string[] args)
        {
            PersonInfoCopy p = new PersonInfoCopy();
            p.Name = "zhangsan";
            p.Address = "shanghai";
            p.SetWork2("1998", "上学");
            PersonInfoCopy p2 =(PersonInfoCopy) p.Clone();
            p2.SetWork2("2002", "上大学");
            p.Display();
            p2.Display();
            Console.Read();
        }
    }

  
    //深拷贝
    public class PersonInfoCopy : ICloneable
    {
        public string Name { get; set; }
        public string Address { get; set; }
        private string timeArea;
        private string content;
        private WorkExperince work ;
        public PersonInfoCopy()
        {
            work = new WorkExperince();
        }
        private PersonInfoCopy(WorkExperince workExperince)
        {
            work = (WorkExperince) workExperince.Clone();//让此类的work在内存中重新开辟一个存储空间
        }
        public object Clone()
        {
            //return this.MemberwiseClone();//方法只有这一行的话是浅拷贝 

            #region 深拷贝代码  由于引用类型(WorkExperince)在类(PersonInfoCopy)中不能深拷贝,所以要让WorkExperince继承
            //ICloneable 接口,然后在private构造函数中copy一个WorkExperince的实例,相当于令开辟了一个地址,与原来的类的实例P的work的地址不同
            PersonInfoCopy p1 = new PersonInfoCopy(work);
            p1.Name = this.Name;
            p1.Address=this.Address;
            return p1;
            #endregion
        }
        public void Display()
        {   
            Console.WriteLine(Name+":  "+Address);
            //Console.WriteLine(timeArea+"   "+content);
            Console.WriteLine(work.TimeArea + "   " + work.Content);

        }
      
        public void SetWork2(string time, string content)
        {
            this.work.TimeArea = time;
            this.work.Content = content;
        }

    }

  

  public  class WorkExperince:ICloneable
    {
        public string TimeArea { get; set; }
         
        public string Content { get; set; }

        public object Clone()
        {
            return this.MemberwiseClone();
        }
    }
}

1.浅拷贝输出:
zhangsan: shanghai
2002 上大学
zhangsan: shanghai
2002 上大学

2.深拷贝输出:
zhangsan: shanghai
1998 上学
zhangsan: shanghai
2002 上大学

注释为个人理解
网上摘录:深拷贝浅拷贝解释
浅拷贝和深拷贝是不同的,浅拷贝虽然将原有对象复制一份,但是依然保存的是引用,所以对新对象里的引用里的值进行修改,依然会改变原对象里的列表的值,新对象和原对象完全分离开并没有完全分离开。而深拷贝则不同,它会将原对象里的引用也新创建一个,即新建一个列表,然后放的是新列表的引用,这样就可以将新对象和原对象完全分离开
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_34493908/article/details/81560546

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值