C#中的类都属于引用类型,引用类型变量的赋值只复制对对象的引用,而不复制对象本身(浅度复制)。即使用 ‘=’,是将对象的地址赋值给新对象。
1.直接赋值
class Transform
{
public int iPositionX;
public int iPositionY;
public Transform(int x,int y)
{
iPositionX = x;
iPositionY = y;
}
}
class Program
{
static void Main(string[] args)
{
//原Transform
Transform originalTransform = new Transform(10, 10);
//新Transform
Transform newTransform = originalTransform;
//改变原Transform的值
originalTransform.iPositionX = 20;
originalTransform.iPositionY = 20;
//输出两个Transform的值
Console.WriteLine("原Transform:" + " x:" + originalTransform.iPositionX + ",y:" + originalTransform.iPositionY);
Console.WriteLine("新Transform:" + " x:" + newTransform.iPositionX + ",y:" + newTransform.iPositionY);
}
}
输出结果:
原Transform: x:20,y:20
新Transform: x:20,y:20
可以看到,原对象的值改变,新对象的值也随着改变。
2.使用new赋值
class Transform
{
public int iPositionX;
public int iPositionY;
public Transform(int x,int y)
{
iPositionX = x;
iPositionY = y;
}
}
class Program
{
static void Main(string[] args)
{
//原Transform
Transform originalTransform = new Transform(10, 10);
//新Transform
Transform newTransform = new Transform(originalTransform.iPositionX, originalTransform.iPositionY);
//改变原Transform的值
originalTransform.iPositionX = 20;
originalTransform.iPositionY = 20;
//输出两个Transform的值
Console.WriteLine("原Transform:" + " x:" + originalTransform.iPositionX + ",y:" + originalTransform.iPositionY);
Console.WriteLine("新Transform:" + " x:" + newTransform.iPositionX + ",y:" + newTransform.iPositionY);
}
}
输出结果:
原Transform: x:20,y:20
新Transform: x:10,y:10
可以看到,原对象的值改变,新对象的值并没有改变。
通过new一个新对象,再把原对象的属性赋值给新对象,实现深度复制。这里对象的属性是int,而int类型为值类型,所以可以实现深度复制;如果对象的属性还是类,那么就还不能实现深度复制。
关于“值类型和引用类型”,参考: 值类型和引用类型的区分