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);
}
}
出力結果:
元の変換: x:20,y:20
新しい変換: x:20,y:20
元のオブジェクトの値が変化すると、新しいオブジェクトの値も変化することがわかります。
2. 新しい割り当てを使用する
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);
}
}
出力結果:
元の変換: x:20,y:20
新しい変換: x:10,y:10
ご覧のとおり、元のオブジェクトの値は変化しますが、新しいオブジェクトの値は変化しません。
新しいオブジェクトを作成し、元のオブジェクトのプロパティを新しいオブジェクトに割り当てることで、ディープ コピーが実現されます。ここでのオブジェクトの属性はintであり、int型はvalue型なのでディープコピーが可能ですが、オブジェクトの属性がクラスのままであればまだディープコピーはできません。
「値型と参照型」については、「値型と参照型の違い」を参照してください。