原文: C#中實作對象的深拷貝
深度拷貝指的是将一個引用類型(包含該類型裡的引用類型)拷貝一份(在記憶體中完完全全是兩個對象,沒有任何引用關系).......... 直接上代碼:
1 /// <summary>
2 /// 對象的深度拷貝(序列化的方式)
3 /// </summary>
4 public static class MyDeepCopy
5 {
6
7 /// <summary>
8 /// xml序列化的方式實作深拷貝
9 /// </summary>
10 /// <typeparam name="T"></typeparam>
11 /// <param name="t"></param>
12 /// <returns></returns>
13 public static T XmlDeepCopy<T>(T t)
14 {
15 //建立Xml序列化對象
16 XmlSerializer xml = new XmlSerializer(typeof(T));
17 using (MemoryStream ms = new MemoryStream())//建立記憶體流
18 {
19 //将對象序列化到記憶體中
20 xml.Serialize(ms, t);
21 ms.Position = default;//将記憶體流的位置設為0
22 return (T)xml.Deserialize(ms);//繼續反序列化
23 }
24 }
25
26 /// <summary>
27 /// 二進制序列化的方式進行深拷貝
28 /// 確定需要拷貝的類裡的所有成員已經标記為 [Serializable] 如果沒有加該特性特報錯
29 /// </summary>
30 /// <typeparam name="T"></typeparam>
31 /// <param name="t"></param>
32 /// <returns></returns>
33 public static T BinaryDeepCopy<T>(T t)
34 {
35 //建立二進制序列化對象
36 BinaryFormatter bf = new BinaryFormatter();
37 using (MemoryStream ms = new MemoryStream())//建立記憶體流
38 {
39 //将對象序列化到記憶體中
40 bf.Serialize(ms, t);
41 ms.Position = default;//将記憶體流的位置設為0
42 return (T)bf.Deserialize(ms);//繼續反序列化
43 }
44 }
45 }
View Code
淺拷貝指的是将該類型裡面的值類型拷貝,而該類型裡的引用類型不進行拷貝,實作淺拷貝很簡單,再該類裡編寫一個方法,方法内部調用自身的MemberwiseClone()方法即可得到一個object類型的對象,将它強轉成目前對象傳回即可,列如:
1 public class Person
2 {
3 public int ID { get; set; }
4 public string Name { get; set; }
5 public string Email { get; set; }
6 public Cat Cat { get; set; }
7
8 /// <summary>
9 /// Person類的淺拷貝
10 /// </summary>
11 /// <returns></returns>
12 public Person QainClone()
13 {
14 //調用自帶的淺拷貝方法得到的是一個objec類型的對象,然後強轉直接傳回就可以了
15 return MemberwiseClone() as Person;
16 }
17 }