浅复制:字段是值类型,则对其执行逐位复制,通俗讲就是赋值;字段为引用类型,则直接复制其引用,也就是说原始对象和克隆对象引用的是同一个对象。
深复制:值类型字段的复制方式与浅复制相同;对于引用类型的字段,重新实例化一个内容相同但引用不同的字段,也就是说原始对象和克隆对象引用的不是同一个对象。
文字可能过于抽象,例子:
namespace Project_1
{
class IdInfo
{
public int id;
public IdInfo(int id)
{
this.id = id;
}
}
class Person
{
public int age;
public string name;
public IdInfo idInfo;
public Person(int age, string name, int id)
{
this.age = age;
this.name = name;
this.idInfo = new IdInfo(id);
}
public Person ShallowCopy()
{
return (Person)this.MemberwiseClone();
}
public Person DeepCopy()
{
Person p = (Person)this.MemberwiseClone();
p.name = string.Copy(name);
p.idInfo = new IdInfo(idInfo.id);
return p;
}
}
class Program
{
static void Main(string[] args)
{
//浅复制测试用例
Person p1 = new Person(15, "Wyhon", 1234);
Person p2 = p1.ShallowCopy();
Display(p1);
Display(p2);
Console.WriteLine("------------------------------------------------------------");
p1.age = 16;
p1.name = "Wyhon1";
p1.idInfo.id = 5678;
Display(p1);
Display(p2);
//深复制测试用例
Console.WriteLine("------------------------------------------------------------");
Person p3 = p1.DeepCopy();
p1.age = 17;
p1.name = "wyhon2";
p1.idInfo.id = 7891;
Display(p1);
Display(p3);
}
static void Display(Person p)
{
Console.WriteLine("Name: {0}, Age: {1}, ID: {2}", p.name, p.age, p.idInfo.id);
}
}
}