6.27值类型,引用类型,深拷贝,浅拷贝
创建类型实例a,a属性赋值,b=a,a改变属性值,b属性值随之改变;
创建类型List<int> d,e=d,e增加一个成员,d集合count+1;
类,list ,int[] 等于都是传递引用的地址
创建类型实例a,a属性赋值
创建类型b,b.属性=a.属性
改变 a int 属性值和 string 属性值
发现 b int 属性值不变 string属性值不变
结论:
即使类不用等于传递(a=b),而是用a.属性=b.属性,属性中的引用类型传递的数值改变也是影响a b两个实例的(string类型除外,string表现的特性是值类型)
所以要想构件相互不干扰的两个相同的类实例,用深复制
值类型
包括 结构和枚举,还有一种特殊的值类型,称为简单类型(Simple Type)
引用类型
包括类、接口、委托 等。
深拷贝
拷贝对象就和源对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。
值类型等于。
一个人叫张三,然后使用克隆技术以张三来克隆另外一个人叫李四,这样张三和李四就是相互独立的,不管张三缺胳膊还是李四少腿了都不会影响另外一个人
浅拷贝
拷贝一个对象时,仅仅拷贝对象的引用进行拷贝,但是拷贝对象和源对象还是引用同一份实体。此时,其中一个对象的改变都会影响到另一个对象。
引用类型的等于。
一个人一开始叫张三,后来改名字为张老三了,可是他们还是同一个人,不管张三缺胳膊还是张老三少腿,都反应在同一个人身上。
引用类型的深拷贝
1 反射,反序列化,表达树方式,推荐反系列化
http://www.cnblogs.com/zhili/p/DeepCopy.html
2 用ICloneable接口
MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。
如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。
MemberwiseClone equals =
结论:
不建议用ICloneable接口,不建议用反射(会有引用的问题)还是用序列化吧