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

C# 淺層複製與深層複製 (二) - MemberwiseClone 範例

     編輯:關於C語言

承上篇概念,本文提供 `MemberwiseClone` 實作淺層複製的完整範例,並展示參考型別欄位共用實例的行為。

淺層複製核心:MemberwiseClone

  • 受保護方法,建立目前物件的淺層副本。
  • 值型別欄位:逐位複製 (獨立副本)。
  • 參考型別欄位:複製參考 (指向同一堆積物件)。

完整範例程式碼


using System;

class Car
{
    public string Name;
    public Car(string name) => Name = name;
}

class Person
{
    public int Id;
    public string Name;
    public Car Car;

    public Person(int id, string name, Car car)
    { Id = id; Name = name; Car = car; }

    public object Clone() => MemberwiseClone(); // 淺層複製
}

class Program
{
    static void Main()
    {
        var p1 = new Person(1, "Scott", new Car("BMW"));
        var p2 = (Person)p1.Clone(); // 淺層複製

        Console.WriteLine("修改 p1 後:");
        p1.Id = 2;
        p1.Name = "Lacy";
        p1.Car.Name = "紅旗"; // 修改參考型別欄位指向的物件

        Console.WriteLine($"p1: Id={p1.Id}, Name={p1.Name}, Car={p1.Car.Name}");
        Console.WriteLine($"p2: Id={p2.Id}, Name={p2.Name}, Car={p2.Car.Name}");
        // 輸出:
        // p1: Id=2, Name=Lacy, Car=紅旗
        // p2: Id=1, Name=Scott, Car=紅旗  ← Car 同一物件,Name 被改變
    }
}

執行結果分析

欄位類型p1 修改後p2 受影響?原因
Idint (值型別)2否獨立副本
Namestring (參考型別,但不可變)Lacy否字串重新指派,p2 仍指向原字串
CarCar (參考型別,可變)紅旗**是**p1/p2 共用同一 Car 實例,修改其屬性雙方可見

關鍵結論

  • **值型別** 與 **不可變參考型別 (string, delegate 等)** 在淺層複製後表現如深層複製 (安全)。
  • **可變參考型別** (自訂 class、List、Array、DataTable...) 會共用實例,**修改其內部狀態會互相影響**。
  • 若物件圖僅含值型別/不可變型別,`MemberwiseClone` 即等效深層複製。

何時使用淺層複製?

  • 效能關鍵、物件圖單層且無可變參考型別。
  • 刻意要共用子物件 (如共用設定物件、快取)。
  • 實作 `ICloneable` 時文件明確註明為淺層複製。

下一篇將介紹深層複製的三種實作方式:序列化、反射、手動遞迴。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved