承上篇概念,本文提供 `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 受影響? | 原因 |
|---|---|---|---|---|
| Id | int (值型別) | 2 | 否 | 獨立副本 |
| Name | string (參考型別,但不可變) | Lacy | 否 | 字串重新指派,p2 仍指向原字串 |
| Car | Car (參考型別,可變) | 紅旗 | **是** | p1/p2 共用同一 Car 實例,修改其屬性雙方可見 |
下一篇將介紹深層複製的三種實作方式:序列化、反射、手動遞迴。