对象复制
1.浅复制
只复制值类型成员,称之为浅复制。
对于引用成员,只是复制其的引用地址,所以被复制对象的引用成员和复制对象的引用成员的引用地址相同,指向了同一个对象
在object类中有一个MemberwiseClone方法实现了浅复制
protected Object MemberwiseClone()
由于是受保护的,所以要在实现类中提供一个公开方法去调用MemberwiseClone。
例如:
class Order
{
public int id = 0;
public Car car = new Car();
public Order Clone()
{
return this.MemberwiseClone() as Order;
}
}
class Car
{
private int sortId;
public int SortId
{
get { return sortId; }
set { sortId = value; }
}
}
static void Main()
{
//说明
//值成员的值改变不会影响另一个对象,
//被复制对象的引用成员里面的成员值改变,复制对象的引用成员也会受到影响,
//因为它们的引用成员所指向的是同一个对象。
//而深复制则要为引用成员创建新的实例,这样就不会指向同一个对象。
Order o1 = new Order();
o1.id = 12;
o1.car.SortId = 44;
Order o2 = o1.Clone();
o2.id = 24;
o2.car.SortId = 111;
MessageBox.Show(o1.id.ToString()); //o1.id is 12
MessageBox.Show(o1.car.SortId.ToString()); //o1.car.SorgId is 111
MessageBox.Show(o2.id.ToString()); //o1.id is 24
MessageBox.Show(o2.car.SortId.ToString()); //o1.car.SorgId is 111
}
2.深复制
由于被复制的对象的引用成员的改变会对原始对象造成影响,所以一般要进行深复制。
深复制不仅仅复制值成员,还要为引用成员创建新的实例,也就是说原始对象的引用成员和被复制对象的
引用成员将不再指向同一个对象。
示例:
class Order
{
public int id = 0;
public Car car = new Car();
public Order Clone()
{
Order clone = new Order();
clone.id = this.id;
clone.car = new Car();
clone.car.SortId = this.car.SortId;
return clone;
}
}
class Car
{
private int sortId;
public int SortId
{
get { return sortId; }
set { sortId = value; }
}
}
static void Main()
{
//说明
被复制对象o2的引用成员car的成员值改变将不会影响到原始成员o1
Order o1 = new Order();
o1.id = 12;
o1.car.SortId = 44;
Order o2 = o1.Clone();
o2.id = 24;
o2.car.SortId = 111;
MessageBox.Show(o1.id.ToString()); //o1.id is 12
MessageBox.Show(o1.car.SortId.ToString()); //o1.car.SorgId is 44
MessageBox.Show(o2.id.ToString()); //o1.id is 24
MessageBox.Show(o2.car.SortId.ToString()); //o1.car.SorgId is 111
}