C# には 2 種類の変数があり、1 つは値型変数、もう 1 つは参照型変数です。前者の場合、コピーはフルディスクのコピーであり、後者の場合、一般コピーはメモリ内のアドレスをコピーするだけのシャローコピーに過ぎません。
浅いコピーと深いコピーの違い
インスタンスオブジェクト内の対応するオブジェクトタイプのメモリをコピーするかどうか
浅いコピーと深いコピーの例
この例から、インスタンス 2 がインスタンス 1 をコピーしましたが、インスタンス 2 の ColorQian の割り当ては依然としてインスタンス 1 に影響を与えていることがわかります。
public class ColorQian
{
public int red;
public int green;
public int blue;
public ColorQian(int red, int green, int blue)
{
this.red = red;
this.green = green;
this.blue = blue;
}
}
public class MyobjectQian : ICloneable
{
public int id;
public string size;
public ColorQian color;
public MyobjectQian(int id, string size, ColorQian colorQian)
{
this.id = id;
this.size = size;
this.color = colorQian;
}
public object Clone()
{
return new MyobjectQian(this.id,this.size,this.color);
}
//重写Tostring方法
public override string ToString()
{
var s = String.Format("id:{0},size:{1},color:({2},{3},{4})",
this.id, this.size, this.color.red, this.color.green, this.color.blue);
return s;
}
}
public void QianTest()
{
ColorQian colorQian = new ColorQian(25, 99, 80);
MyobjectQian myobjectQian = new MyobjectQian(1001, "small", colorQian);
MyobjectQian myobjectQian1 = (MyobjectQian)myobjectQian.Clone();
myobjectQian1.size = "big";
myobjectQian1.id = 8001;
//ColorQian 浅表复制,只复制了地址
myobjectQian1.color.red =111 ;
myobjectQian1.color.blue = 111;
myobjectQian1.color.green = 111;
MyobjectQian myobject3 = (MyobjectQian)myobjectQian.Clone();
myobject3.size = "narmal";
myobject3.id = 9001;
//深表复制:进行对象复制的时候,对象所有成员都重写分配空间
myobject3.color = new ColorQian(100, 25, 89);
Console.WriteLine(myobjectQian);
Console.WriteLine(myobjectQian1);
Console.WriteLine(myobject3);
}
最も直接的な方法は、クラスごとに ICloneable インターフェイスを実装して、ディープ コピーを実現し、オブジェクトの作成時間を節約することです。
public class Color:ICloneable
{
public int red;
public int green;
public int blue;
public Color(int red, int green, int blue)
{
this.red = red;
this.green = green;
this.blue = blue;
}
//节约对象创建的时间
public object Clone()
{
return new Color(red , green, blue);
}
}
public class Myobject : ICloneable
{
public int id;
public string size;
public Color color;
public Myobject(int id, string size, Color color)
{
this.id = id;
this.size = size;
this.color = color;
}
Color的浅表复制
// public object Clone()
// {
// return new Myobject(this.id, this.size, this.color);
// }
//Color的深表复制
public object Clone()
{
return new Myobject(this.id, this.size, (Color)this.color.Clone());
}
//重写Tostring方法
public override string ToString()
{
var s = String.Format("id:{0},size:{1},color:({2},{3},{4})",
this.id, this.size, this.color.red, this.color.green, this.color.blue);
return s;
}
}
public void test1()
{
Color color = new Color(25, 99, 80);
Myobject myobject1 = new Myobject(1001, "small", color);
//调用clone创建新的Myobject
//在Clone时,出现对象引用的复制,为浅表复制,即只复制了该对象的地址,并没有重新分配地址
Myobject myobject2 = (Myobject)myobject1.Clone();
myobject2.size = "big";
myobject2.id = 5001;
//浅表复制
myobject2.color.red = 165;
myobject2.color.green = 56;
myobject2.color.blue = 45;
//深表复制:进行对象复制的时候,对象所有成员都重写分配空间
Myobject myobject3 = (Myobject)myobject1.Clone();
myobject3.size = "narmal";
myobject3.id = 9001;
myobject3.color = new Color(100, 25, 89);
Console.WriteLine(myobject1);//Console打印对象的时候默认调用Tostring方法
Console.WriteLine(myobject2);
Console.WriteLine(myobject3);
}