首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 設計模式:原型模式 (4) - 淺拷貝 vs 深拷貝完整對比與 ICloneable 實作

     編輯:關於C語言

淺拷貝

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 參考欄位
適用場景單純值型別或可安全共用參考需完全隔離狀態
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved