C#中的深复制和浅复制(在C#中克隆对象)
C# 支持两种类型:“值类型”和“引用类型”。? 如何来划分它们? 值类型与引用类型的区别?
堆栈(stack)是一种先进先出的数据结构,在内存中,变量会被分配在堆栈上来进行操作。 关于对象克隆的所设计到知识点
??????? 对值类型字段只是简单的拷贝一个副本到目标对象,改变目标对象中值类型字段的值不会反映到原始对象中,因为拷贝的是副本
??????? 原始对象中对应字段相同(内容相同)的字段,也就是说这个引用和原始对象的引用是不同, 我们改变新
namespace DeepCopy { class DrawBase : System.Object,ICloneable { public List<string> listName = new List<string>(); public string name = "old"; public DrawBase() { } public object Clone() { //任选一个 return this as object; //引用同一个对象 //return this.MemberwiseClone(); //浅复制 //return new DrawBase() as object;//深复制 } } class Program { static void Main(string[] args) { DrawBase rect = new DrawBase(); Console.WriteLine(rect.name); DrawBase line = rect.Clone() as DrawBase; line.name = "new"; line.listName.Add("123"); Console.WriteLine(rect.name); Console.WriteLine(rect.listName.Count); Console.ReadLine(); } } } ? ?当return this as object;? 输出:old,new,1 ? 说明:方法总是引用同一个对象,因此相应的堆内存上的值会改变 ? 当return this.MemberwiseClone(); 输出:old,old,1 说明:对于内部的Class的对象和数组,会Copy地址一份。[从而改变B时,A也被改变了]而对于其它内置的int/string/Enum/struct/object类型,则进行值copy。 ? 当return new DrawBase() as object; 输出:old,old,0 说明:完全是创建一个新对象 ? 总结: 浅拷贝:是指将对象中的所有字段逐字复杂到一个新对象。对值类型字段只是简单的拷贝一个副本到目标对象,改变目标对象中值类型字段的值不会反映到原始对象中,因为拷贝的是副本;对引用型字段则是指拷贝他的一个引用到目标对象。改变目标对象中引用类型字段的值它将反映到原始对象中,因为拷贝的是指向堆是上的一个地址;深拷贝:深拷贝与浅拷贝不同的是对于引用字段的处理,深拷贝将会在新对象中创建一个新的对象和原始对象中对应字段相同(内容相同)的字段,也就是说这个引用和原始对象的引用是不同, 我们改变新对象中这个字段的时候是不会影响到原始对象中对应字段的内容。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |