C# 建立物件的淺層複製(Shallow Clone/Copy)及深層複製(Deep Clone/Copy)

C# 建立物件的淺層複製(Shallow Clone/Copy)及深層複製(Deep Clone/Copy)

在C#中,物件的淺層複製(Shallow Copy)和深層複製(Deep Copy)是兩種不同的複製方式,它們在複製物件時的行為和結果有所不同。

淺層複製(Shallow Copy)

淺層複製是指創建一個新的物件,並將原物件的值類型字段複製到新物件中。然而,當數據是參考類型時,只有參考本身被複製,而不是被參考的物件本身。因此,原物件和複製物件將指向同一個物件。這意味著,如果修改了複製物件中的參考類型字段,原物件中的相同字段也會被修改。

在C#中,可以使用MemberwiseClone()方法來實現淺層複製。這個方法會創建一個新的物件,並將原物件的所有字段複製到新物件中。但是,如果字段是參考類型,則只複製參考,而不是參考的物件本身。

  1. public object Shallowcopy()
  2. {
  3. return this.MemberwiseClone();
  4. }

深層複製(Deep Copy)

深層複製則是創建一個新的物件,並將原物件的所有字段(包括參考類型字段)複製到新物件中。這意味著,即使是參考類型字段,也會創建一個新的物件來替換原物件中的參考。因此,原物件和複製物件之間的參考類型字段是完全獨立的,修改其中一個不會影響另一個。

在C#中,實現深層複製需要手動實現。這通常涉及到創建一個新的物件,並將原物件的所有字段(包括參考類型字段)複製到新物件中,並確保參考類型字段也被複製。

深層複製的寫法有很多種,

方法1: 二進制序列化(Binary Serialization)

  • 複製對象 Class 必需標記 [Serializable] 標籤
  1. [Serializable]
  2. public class Person
  3. {
  4. public string Name { get; set; }
  5. public int Age { get; set; }
  6. }
  7. public static T DeepClone<T>(this T source)
  8. {
  9. if (!typeof(T).IsSerializable)
  10. {
  11. throw new ArgumentException("The type must be serializable.", nameof(source));
  12. }
  13. if (source != null)
  14. {
  15. using (MemoryStream stream = new MemoryStream())
  16. {
  17. var formatter = new BinaryFormatter();
  18. formatter.Serialize(stream, source);
  19. stream.Seek(0, SeekOrigin.Begin);
  20. return (T)formatter.Deserialize(stream);
  21. }
  22. }
  23. return default(T);
  24. }
  25. static void Main(string[] args)
  26. {
  27. Person originalPerson = new Person { Name = "John Doe", Age = 30 };
  28. Person clonedPerson = originalPerson.DeepClone();
  29. Console.WriteLine($"Original Person: {originalPerson.Name}, {originalPerson.Age}");
  30. Console.WriteLine($"Cloned Person: {clonedPerson.Name}, {clonedPerson.Age}");
  31. // 修改複製物件的屬性
  32. clonedPerson.Name = "Jane Doe";
  33. clonedPerson.Age = 25;
  34. Console.WriteLine($"Modified Cloned Person: {clonedPerson.Name}, {clonedPerson.Age}");
  35. Console.WriteLine($"Original Person remains unchanged: {originalPerson.Name}, {originalPerson.Age}");
  36. }
  37. //執行結果:
  38. //Original Person: John Doe, 30
  39. //Cloned Person: John Doe, 30
  40. //Modified Cloned Person: Jane Doe, 25
  41. //Original Person remains unchanged: John Doe, 30

總結

  • 淺層複製:創建一個新的物件,並將原物件的值類型字段複製到新物件中。參考類型字段的參考被複製,而不是被參考的物件本身。
  • 深層複製:創建一個新的物件,並將原物件的所有字段(包括參考類型字段)複製到新物件中,確保參考類型字段也被複製。

這兩種複製方式在不同的情況下有不同的用途和效果,選擇使用哪種方式取決於具體的需求和應用場景。

 

 

留言

這個網誌中的熱門文章

ORA-12514: TNS: 監聽器目前不知道連線描述區中要求的服務

Oracle 工作排程 DBMS_JOB 筆記

Oracle 例外控制(Exception Control)