C# 型別系統分為 **值型別** 與 **參考型別**,理解兩者在記憶體中的配置與複製語意,是掌握淺/深層複製的基石。
| 類別 | 包含型別 | 記憶體配置 |
|---|---|---|
| 值型別 | struct、enum、基本型別 (int, double, bool, char...)、Tuple (C# 7+) | 堆疊 (區域變數) / 內嵌於物件 |
| 參考型別 | class、interface、delegate、array、string、object | 堆積 (物件本體) + 堆疊/內嵌 (參考指標) |
值型別 (int a = 10; int b = a;)
棧: [a: 10] [b: 10] ← 獨立副本,互不影響
參考型別 (Person p1 = new Person(); Person p2 = p1;)
棧: [p1: 0x1000] [p2: 0x1000] → 指向同一堆積物件
堆: [0x1000] Person { Name = "Tom", Age = 20 }
| 複製類型 | 值型別欄位 | 參考型別欄位 | 適用場景 |
|---|---|---|---|
| 淺層複製 | 逐位複製 (獨立) | 複製參考 (共用實例) | 單層物件、無可變參考、效能優先 |
| 深層複製 | 逐位複製 (獨立) | 遞迴建立新實例並複製內容 (完全獨立) | 複雜物件圖、需完全隔離、序列化/備份 |
.NET 文件明確建議 **不要** 公開實作 `ICloneable`,因其未定義淺/深層語意,導致呼叫端無法預期行為。建議自訂介面:
public interface IDeepCloneable { T DeepClone(); }
public interface IShallowCloneable { T ShallowClone(); }
下一篇將展示 `MemberwiseClone` 淺層複製完整程式碼與行為驗證。