今天研究了一下c#对象的赋值问题,特此总结,欢迎批评指正。
值类型变量的赋值很简单,下面所讲皆为引用类型变量。
1、等号(=)赋值:对象的赋值操作相当于引用;
2、浅拷贝:只拷贝基本类型,对象中的对象等资源不会被拷贝。在c#中通过继承接口ICloneable并手动实现其Clone方法,使用Object类MemberwiseClone实现;
3、深拷贝:在内存中重新开辟一片空间,复制和源对象完全相同的数据进来,和源对象完全独立,互不影响。可以自定义处理,也可以通过ICloneable接口实现。
下面是自己写的测试列子
public class Car
{
public Car(int price, string color)
{
this._price = price;
this._color = color;
}
public Car(Car a)
{
this._color = a._color;
this._price = a._price;
}
public void SetPrice(int newPrice)
{
_price = newPrice;
}
public int GetPrice()
{
return _price;
}
int _price;
string _color;
}
public class Person : ICloneable
{
public Person(int age, string name, Car car)
{
this._age = age;
this._name = name;
this._car = new Car(car);
}
public Person(Person p)
{
this._age = p._age;
this._name = p._name;
this._car = new Car(p._car);
}
public void SetAge(int age)
{
_age = age;
}
public int GetAge()
{
return _age;
}
public object Clone()
{
return this.MemberwiseClone();
}
int _age;
string _name;
public Car _car;
}
class Program
{
static void Main(string[] args)
{
Car bmw = new Car(680000, "black");
Person zhangsan = new Person(18, "zhangsan", bmw);
// 深拷贝,是完全不用于原来的对象的新对象,任意修改不会改变原对象的值
Person zhaoliu = new Person(zhangsan);
zhaoliu._car.SetPrice(1000000);
Console.WriteLine("zhaoliu deepclone zhangsan, car price: " + zhaoliu._car.GetPrice());
Console.WriteLine("zhangsan car price: " + zhangsan._car.GetPrice());
// 浅拷贝,对象中的对象不能被复制,依然是引用状态,修改其会导致原对象中的对象被修改
Person wangwu = (Person)zhangsan.Clone();
wangwu._car.SetPrice(180000);
// 但是基本类型的值是被拷贝的,和原对象不同
wangwu.SetAge(68);
// 对象中的对象值被修改
Console.WriteLine("wangwu wiseclone zhangsan, car price: " + wangwu._car.GetPrice());
Console.WriteLine("zhangsan car price: " + zhangsan._car.GetPrice());
// 原对象的基本类型的值未被修改
Console.WriteLine("wangwu age: " + wangwu.GetAge());
Console.WriteLine("zhangsan age: " + zhangsan.GetAge());
// “=” 赋值相当于引用
Person lisi = zhangsan;
lisi.SetAge(22);
Console.WriteLine("lisi age:" + lisi.GetAge());
Console.WriteLine("zhangsan age: " + zhangsan.GetAge());
<span style="white-space:pre"> </span>}
}
结果: