深浅复制
因为MemberwiseClone()方法只能将值类型的字段复制到MemberwiseClone()方法创建的新的副本中,而引用类型的值则不能被复制到副本中,这种复制方式为浅复制,在我们写代码过程中可能会满足不了我们的功能要求。
所以所以前人根据工作经验,结合MemberwiseClone()方法总结出深复制的样本。
怎样从浅复制到深复制
从浅复制到深复制的原理其实很简单,就是将引用类型的字段变成值类型的字段。
下面我讲一下如何将引用类型转换为值类型的字段。
其实原理很简单就是使用MemberwiseClone()方法。我们在被引用的类中调用MemberwiseClone()方法,将该类中的所有值类型字段复制到MemberwiseClone()创建的副本中。
然后我们在引用类(就是要使用被引用类中字段的类)中创建引用类的实例,将被引用类中所有的字段赋值给引用类中这个新创建的实例,这样我们就将引用型的字段变成了值类型的字段。让后创建一个引用类实例,将被引用类的实例赋值给引用类实例。这样被引用类中的字段就变成了引用类中的字段。
从简单赋值到深层赋值实例
被引用类
class WorkExperience:ICloneable
{
private string workDate;
public string WorkDate
{
get { return workDate; }
set { workDate = value; }
}
private string company;
public string Company
{
get { return company; }
set { company = value; }
}
//该方法用来克隆被引用类中的所有的值类型字段
public object Clone()
{
return (object)this.MemberwiseClone();
}
}
引用类
class Resume:ICloneable
{
private string name;
private string sex;
private string age;
private WorkExperience work;//用来接收所有被引用类中的值类型字段
public Resume (string name)
{
this.name = name;
work = new WorkExperience();
}
//将被引用类中的所有值类型字段赋值给work
private Resume(WorkExperience work)
{
this.work = (WorkExperience ) work.Clone();
}
public void SetPersonalInfo(string sex,string age )
{
this.sex = sex;
this.age = age;
}
public void SetWorkExperience(string workDate,string company)
{
work.WorkDate = workDate;
work.Company = company;
}
public void Display()
{
Console.WriteLine("{0} {1} {2}", name, sex, age);
Console.WriteLine("工作经历:{0} {1}", work.WorkDate, work.Company );
}
//创建一个引用类obj,然后将被引用类work中所有的字段,全部赋值给引用类obj。
最后将引用类中所有字段赋值给obj,这样引用类就obj就包含了被引用类和引用类中的所有的字段
public object Clone()
{
Resume obj = new Resume(this.work);
obj.name = this.name;
obj.sex = this.sex;
obj.age = this.age;
return obj;
}
}