--浅复制
class Resume:ICloneable { private string UserName; private string Sex; private int Age; private string Company; private string TimeArea; public Resume(string Name) { this.UserName = Name; } //设置个人信息 public void SetPerson(string Sex, int Age) { this.Sex = Sex; this.Age = Age; } //设置工作经历 public void SetWorkExperience(string Company, string TimeArea) { this.Company = Company; this.TimeArea = TimeArea; } //显示个人信息 public void Display() { Console.WriteLine("姓名:{0},性别:{1},年龄:{2}", UserName, Sex, Age); Console.WriteLine("工作经历:公司名称:{0},工作时间:{1}",Company,TimeArea); } //创建当前对象的浅表副本 //方法是创建一个新的对象,将当前对象的字段信息复制到该新对象 //如果该字段类型为值类型,那么对该字段执行逐位复制 //如果是引用类型,则复制引用但不复制引用对象 public object Clone() { return (Object)this.MemberwiseClone(); } static void Main() { Resume a = new Resume("ws_hgo"); a.SetPerson("男", 23); a.SetWorkExperience("百捷网络", "2008-2009"); //创建对象a的浅表副本 Resume b = (Resume)a.Clone(); b.SetWorkExperience("信荣科技", "2009-2010"); Resume c = (Resume)a.Clone(); c.SetWorkExperience("金讯科技", "2010-至今"); a.Display(); b.Display(); c.Display(); } }
结果:

当我工作经历抽象成一个方法的时候,还是用上面的方法
代码如下
//工作经验类 class WorkExperience { private string company; public string Company { set { company = value; } get { return company; } } private string timeArea; public string TimeArea { set { timeArea = value; } get { return timeArea; } } } class Resume:ICloneable { private string UserName; private string Sex; private int Age; private WorkExperience Work; public Resume(string Name) { this.UserName = Name; Work = new WorkExperience(); } //设置个人信息 public void SetPerson(string Sex, int Age) { this.Sex = Sex; this.Age = Age; } //设置工作经历 public void SetWorkExperience(string Company, string TimeArea) { Work.Company = Company; Work.TimeArea = TimeArea; } //显示个人信息 public void Display() { Console.WriteLine("姓名:{0},性别:{1},年龄:{2}", UserName, Sex, Age); Console.WriteLine("工作经历:公司名称:{0},工作时间:{1}", Work.Company, Work.TimeArea); } //创建当前对象的浅表副本 //方法是创建一个新的对象,将当前对象的字段信息复制到该新对象 //如果该字段类型为值类型,那么对该字段执行逐位复制 //如果是引用类型,则复制引用但不复制引用对象 public object Clone() { return (Object)this.MemberwiseClone(); } static void Main() { Resume a = new Resume("ws_hgo"); a.SetPerson("男", 23); a.SetWorkExperience("百捷网络", "2008-2009"); //创建对象a的浅表副本 Resume b = (Resume)a.Clone(); b.SetWorkExperience("信荣科技", "2009-2010"); Resume c = (Resume)a.Clone(); c.SetWorkExperience("金讯科技", "2010-至今"); a.Display(); b.Display(); c.Display(); } }
得到结果确实

而我想要的结果是3个不同的工作经历
此时浅复制不能解决问题
那就用深复制
深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象
深复制实现如下:
//工作经验类 class WorkExperience:ICloneable { private string company; public string Company { set { company = value; } get { return company; } } private string timeArea; public string TimeArea { set { timeArea = value; } get { return timeArea; } } private int age; public int Age { set { age = value; } get { return age; } } //创建当前对象的浅表副本 //方法是创建一个新的对象,将当前对象的字段信息复制到该新对象 //如果该字段类型为值类型,那么对该字段执行逐位复制 //如果是引用类型,则复制引用但不复制引用对象 public object Clone() { return (Object)this.MemberwiseClone(); } } class Resume:ICloneable { private string UserName; private string Sex; private WorkExperience Work; public Resume(string Name) { this.UserName = Name; Work = new WorkExperience(); } /// <summary> /// 克隆工作经验数据 /// </summary> /// <param name="Work"></param> private Resume(WorkExperience Work) { this.Work = (WorkExperience)Work.Clone(); } //设置个人信息 public void SetPerson(string Sex) { this.Sex = Sex; } //设置工作经历 public void SetWorkExperience(string Company, string TimeArea, int Age) { Work.Company = Company; Work.TimeArea = TimeArea; Work.Age = Age; } //显示个人信息 public void Display() { Console.WriteLine("姓名:{0},性别:{1},年龄:{2}", UserName, Sex, Work.Age); Console.WriteLine("工作经历:公司名称:{0},工作时间:{1}", Work.Company, Work.TimeArea); } /// <summary> /// 调用私有构造函数克隆工作经验 /// 将相关字段赋给当前对象 /// 实现深复制克隆的完成 /// </summary> /// <returns></returns> public Object Clone() { Resume obj = new Resume(this.Work); obj.UserName = this.UserName; obj.Sex = this.Sex; return obj; } static void Main() { Resume a = new Resume("ws_hgo"); a.SetPerson("男"); a.SetWorkExperience("百捷网络", "2008-2009",21); //创建对象a的浅表副本 Resume b = (Resume)a.Clone(); b.SetWorkExperience("信荣科技", "2009-2010",22); Resume c = (Resume)a.Clone(); c.SetWorkExperience("金讯科技", "2010-至今",23); a.Display(); b.Display(); c.Display(); } }
结果
:

被折叠的 条评论
为什么被折叠?



