c#中的對象大體分為值類型和引用類型,值類型大致包括 int, string, struct等,引用類型大致包括 自定義Class,object 等。 值類型直接存儲對象,而引用類型存儲對象的地址,在對引用類型進行複製的時候,也只是複製對象的地址。 完全複製一個引用類型對象主要有幾種方法: 1.額外 ...
c#中的對象大體分為值類型和引用類型,值類型大致包括 int, string, struct等,引用類型大致包括 自定義Class,object 等。
值類型直接存儲對象,而引用類型存儲對象的地址,在對引用類型進行複製的時候,也只是複製對象的地址。
完全複製一個引用類型對象主要有幾種方法:
1.額外添加一個構造函數,入參為待複製對象(如果欄位為引用類型,需要繼續添加構造函數,這樣情況會變的十分複雜。)
public class Test1 { private int field1; private int field2; private int field3; public Test1() { } public Test1(Test1 test1) { this.field1 = test1.field1; this.field2 = test1.field2; this.field3 = test1.field3; } }
2.利用序列化反序列化(對性能會有殺傷)
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Threading.Tasks; namespace Test { class Program { static void Main(string[] args) { Test t1 = new Test(); Console.WriteLine(t1.list.Count); Test t2 = (Test)Clone(t1); t2.list.Add(""); Console.WriteLine(t2.list.Count); Console.WriteLine(t1.list.Count); Console.ReadLine(); } public static object Clone(object obj) { BinaryFormatter bf = new BinaryFormatter(); MemoryStream ms = new MemoryStream(); bf.Serialize(ms, obj); ms.Position = 0; return (bf.Deserialize(ms)); ; } } [Serializable] public class Test { public List<string> list = new List<string>(); } }
3.利用反射(測試了一個網上的介面可用,但是對性能殺傷和序列化反序列化相當,而且對代碼混淆有一定影響。 https://www.cnblogs.com/zhili/p/DeepCopy.html)