浅复制
- classResume:ICloneable
- {
- privatestringUserName;
- privatestringSex;
- privateintAge;
- privatestringCompany;
- privatestringTimeArea;
- publicResume(stringName)
- {
- this.UserName=Name;
- }
- //设置个人信息
- publicvoidSetPerson(stringSex,intAge)
- {
- this.Sex=Sex;
- this.Age=Age;
- }
- //设置工作经历
- publicvoidSetWorkExperience(stringCompany,stringTimeArea)
- {
- this.Company=Company;
- this.TimeArea=TimeArea;
- }
- //显示个人信息
- publicvoidDisplay()
- {
- Console.WriteLine("{0} {1} {2}",UserName,Sex,Work.Age);
- Console.WriteLine("工作经历:{1} {0}",Company,TimeArea);
- }
- //创建当前对象的浅表复制
- //方法是创建一个新的对象,将当前对象的字段信息复制到该新对象
- //如果该字段类型为值类型,那么对该字段执行逐位复制
- //如果是引用类型,则复制引用但不复制引用对象
- publicobjectClone()
- {
- return(Object)this.MemberwiseClone();
- }
- staticvoidMain()
- {
- Resume a = new Resume("大鸟");
- a.SetPeraonalInfo("男", "29");
- a.SetWorkExperience("1998-2000", "东南角公司");
- Resume b = (Resume)a.Clone();
- b.SetWorkExperience("2001-2006", "电视剧公司");
- Resume c = (Resume)a.Clone();
- c.SetWorkExperience("2007-至今", "份额公司");
- a.DisPlay();
- b.DisPlay();
- c.DisPlay();
- }
- }
结果:
程序中涉及到的字段类型是值类型,对该字段进行逐位复制,但是如果字段涉及到引用类型的话,则复制引用但不复制引用中的对象。
比如程序中需要加入一个工作经历类,这样再用浅复制就不合适了
下面我们还是用上面的方法将工作经历抽象成一个方法对比一下
代码如下
- //工作经验类
- classWorkExperience
- {
- privatestringcompany;
- publicstringCompany
- {
- set{company=value;}
- get{returncompany;}
- }
- privatestringtimeArea;
- publicstringTimeArea
- {
- set{timeArea=value;}
- get{returntimeArea;}
- }
- }
- classResume:ICloneable
- {
- privatestringUserName;
- privatestringSex;
- privateintAge;
- privateWorkExperienceWork;
- publicResume(stringName)
- {
- this.UserName=Name;
- Work=newWorkExperience();
- }
- //设置个人信息
- publicvoidSetPerson(stringSex,intAge)
- {
- this.Sex=Sex;
- this.Age=Age;
- }
- //设置工作经历
- publicvoidSetWorkExperience(stringCompany,stringTimeArea)
- {
- Work.Company=Company;
- Work.TimeArea=TimeArea;
- }
- //显示个人信息
- publicvoidDisplay()
- {
- Console.WriteLine("{0} {1} {2}",UserName,Sex,Work.Age);
- Console.WriteLine("工作经历:{1} {0}",Work.Company,Work.TimeArea);
- }
- //创建当前对象的浅表复制
- //方法是创建一个新的对象,将当前对象的字段信息复制到该新对象
- //如果该字段类型为值类型,那么对该字段执行逐位复制
- //如果是引用类型,则复制引用但不复制引用对象
- publicobjectClone()
- {
- return(Object)this.MemberwiseClone();
- }
- staticvoidMain()
- {
- Resumea=newResume("大鸟");
- a.SetPerson("男",29);
- a.SetWorkExperience("1998-2000","东南角公司");
- Resumeb=(Resume)a.Clone();
- b.SetWorkExperience("2001-2006","电视剧公司");
- Resumec=(Resume)a.Clone();
- c.SetWorkExperience("2007-至今","2010-份额公司");
- a.Display();
- b.Display();
- c.Display();
- }
- }
结果:
运行结果只显示了最后一个工作经历,显然浅复制就不能满足客户的需求了,那么我们就要深复制来解决这个问题
深复制是把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象
深复制
代码如下:
- //工作经验类
- classWorkExperience:ICloneable
- {
- privatestringcompany;
- publicstringCompany
- {
- set{company=value;}
- get{returncompany;}
- }
- privatestringtimeArea;
- publicstringTimeArea
- {
- set{timeArea=value;}
- get{returntimeArea;}
- }
- privateintage;
- publicintAge
- {
- set{age=value;}
- get{returnage;}
- }
- //创建当前对象的浅表复制
- //方法是创建一个新的对象,将当前对象的字段信息复制到该新对象
- //如果该字段类型为值类型,那么对该字段执行逐位复制
- //如果是引用类型,则复制引用但不复制引用对象
- publicobjectClone()
- {
- return(Object)this.MemberwiseClone();
- }
- }
- classResume:ICloneable
- {
- privatestringUserName;
- privatestringSex;
- privateWorkExperienceWork;
- publicResume(stringName)
- {
- this.UserName=Name;
- Work=newWorkExperience();
- }
- ///克隆工作经验数据
- privateResume(WorkExperienceWork)
- {
- this.Work=(WorkExperience)Work.Clone();
- }
- //设置个人信息
- publicvoidSetPerson(stringSex)
- {
- this.Sex=Sex;
- }
- //设置工作经历
- publicvoidSetWorkExperience(stringCompany,stringTimeArea,intAge)
- {
- Work.Company=Company;
- Work.TimeArea=TimeArea;
- Work.Age=Age;
- }
- //显示个人信息
- publicvoidDisplay()
- {
- Console.WriteLine("{0} {1} {2}",UserName,Sex,Work.Age);
- Console.WriteLine("工作经历:{1} {0}",Work.Company,Work.TimeArea);
- }
- ///调用私有构造函数克隆工作经验
- ///将相关字段赋给当前对象
- ///实现深复制克隆的完成
- publicObjectClone()
- {
- Resumeobj=newResume(this.Work);
- obj.UserName=this.UserName;
- obj.Sex=this.Sex;
- returnobj;
- }
- staticvoidMain()
- {
- Resumea=newResume("大鸟");
- a.SetPerson("男","29");
- a.SetWorkExperience("1998-2000", "东南角公司");
- Resumeb=(Resume)a.Clone();
- b.SetWorkExperience("2001-2006", "电视剧公司");
- Resumec=(Resume)a.Clone();
- c.SetWorkExperience("2007-至今", "份额公司");
- a.Display();
- b.Display();
- c.Display();
- }
- }
结果:
通过运行的结果,相信大家就能很清楚的对比出他们的区别了,也就是说如果你想克隆引用类型的字段,那么就用深复制来解决,如果你的字段中只用值类型,则可以选用浅复制,比如说:数据集对象DataSet,它就有Clone()方法和Copy()方法,Clone()方法用来复制DataSet的数据,而不复制DataSet的数据,实现了原型模式的浅复制;Copy()方法不但复制结构,也复制数据,也就是实现了原型模式的深复制。