class ShallowCopy : ICloneable
{
public int[] v = {1,2,3};
public object Clone() => this.MemberwiseClone(); // 預設淺拷貝
public void Display() { foreach(int i in v) Console.Write(i+", "); Console.WriteLine(); }
}
class Client
{
static void Main()
{
ShallowCopy sc1 = new ShallowCopy();
ShallowCopy sc2 = (ShallowCopy)sc1.Clone();
sc1.v[0] = 9;
sc1.Display(); // 9, 2, 3
sc2.Display(); // 9, 2, 3 ← 共用同一陣列!
}
}
MemberwiseClone() 僅複製值型別欄位與參考位址,參考型別 (陣列) 仍指向同一物件。
class DeepCopy : ICloneable
{
public int[] v = {1,2,3};
public DeepCopy() { }
private DeepCopy(int[] v) => this.v = (int[])v.Clone(); // 陣列深拷貝
public object Clone() => new DeepCopy(this.v); // 建構新物件並深拷貝陣列
public void Display() { foreach(int i in v) Console.Write(i+", "); Console.WriteLine(); }
}
class Client
{
static void Main()
{
DeepCopy dc1 = new DeepCopy();
DeepCopy dc2 = (DeepCopy)dc1.Clone();
dc1.v[0] = 9;
dc1.Display(); // 9, 2, 3
dc2.Display(); // 1, 2, 3 ← 獨立陣列!
}
}
私有建構子接收陣列並 v.Clone(),公開 Clone() 建構新實例,實現完全獨立副本。
| 特性 | 淺拷貝 | 深拷貝 |
|---|---|---|
| 參考型別欄位 | 共用同一物件 | 建立新物件副本 |
| 實作方式 | MemberwiseClone() | 手動 Clone 參考欄位 |
| 適用場景 | 單純值型別或可安全共用參考 | 需完全隔離狀態 |