浅拷贝(shallow copy)指的是当对象的字段被拷贝的时候,字段应用的对象不会被拷贝。
深拷贝是对对象实例当中的字段引用的对象也进行拷贝的一种方式。
浅拷贝可以通过将类实现接口ICloneable
Class MyClass:ICloneable
{
public Object Clone()
{
return MemberwiseClone();
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Chapter6
{
class refClass
{
public int x;
}
class A:ICloneable
{
public refClass c=new refClass();
public int y;
public Object Clone()
{
return MemberwiseClone();
}
}
class Program
{
static void Main(string[] args)
{
A a1 = new A();
A a2 = new A();
a1.y = 10;
a1.c.x = 5;
a2 = a1.Clone() as A;
Console.WriteLine("a1信息,a1.y:{0},a1.refClass.x{1}",a1.y,a1.c.x);
Console.WriteLine("a2信息,a2.y:{0},a2.refClass.x{1}", a2.y, a2.c.x);
Console.WriteLine("修改a1的y和refClass.x后");
a1.y++;
a1.c.x++;
Console.WriteLine("a1信息,a1.y:{0},a1.refClass.x{1}", a1.y, a1.c.x);
Console.WriteLine("a2信息,a2.y:{0},a2.refClass.x{1}", a2.y, a2.c.x);
Console.ReadKey();
}
}
}
结果如下:
为什么修改后的a1.refClass.x 和a2.refClass.x的值一样呢。因为a1的refClass为引用类型,在科隆成a2的时候,a2和a1实际是指向同一块地方。所以,他们的值会同步变化。
深拷贝 往往需要自己定制。
Class MyClass:ICloneable
{
public Object Clone()
{
return 自定义对象;
}
}