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

C# 淺拷貝與深拷貝進階:序列化、反射與屬性標記實作(五)

     編輯:關於C語言

序列化/反序列化實作深拷貝

需在類別與欄位標記 [Serializable] 屬性。透過 BinaryFormatter 序列化至記憶體流再反序列化,可獲得完整獨立副本。

反射實作深拷貝(避免 IO 開銷)

利用 Activator.CreateInstance 建立新實例,再透過 PropertyInfo.GetValue/SetValue 逐屬性複製。可搭配自訂屬性控制拷貝行為:

public class Person
{
    private List<Person> _friends = new List<Person>();

    public string Firstname { get; set; }
    public string Lastname { get; set; }

    [Cloneable(CloneableState.Exclude)]
    [Cloneable(CloneableState.Include, "Friends")]
    public List<Person> Friends { get { return _friends; } }

    [Cloneable(CloneableState.Exclude)]
    public PersonManager Manager { get; set; }
}

此方式不需序列化,效能較佳,且可精細控制哪些欄位深拷貝、哪些淺拷貝或排除。

為什麼 C# 要設計淺/深拷貝?

參考類型預設為淺拷貝(複製參考),若需獨立物件圖則需深拷貝。語言未內建深拷貝,留給開發者依需求實作。

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