6.27值类型,引用类型,深拷贝,浅拷贝

时间:2022-03-27 19:52:24

6.27值类型,引用类型,深拷贝,浅拷贝

创建类型实例a,a属性赋值,b=a,a改变属性值,b属性值随之改变;

创建类型List<int> d,e=d,e增加一个成员,d集合count+1;

类,list ,int[] 等于都是传递引用的地址

6.27值类型,引用类型,深拷贝,浅拷贝

创建类型实例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接口

6.27值类型,引用类型,深拷贝,浅拷贝

 

 

MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。

 如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。

MemberwiseClone equals =

 

结论:

不建议用ICloneable接口,不建议用反射(会有引用的问题)还是用序列化吧