zoukankan      html  css  js  c++  java
  • 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接口,不建议用反射(会有引用的问题)还是用序列化吧

     

  • 相关阅读:
    内存之RAM、SRAM、DRAM、ROM、FLASH、SDRAM、DDR*
    音频接口之AUX、TRS、RCA、SLR、AES/EBU、S/PDIF
    视频接口之AV、S端子、VGA、DVI、HDMI、DP
    选购硬盘HDD、SSD、SSHD、IDE、SATA、SCSI、SAS、PCIe、M.2、USB
    浅析C#中的“==”和Equals
    编写更好的C#代码
    C# 文件下载四方法
    Linq之Lambda表达式初步认识
    .NET逻辑分层架构总结
    理解 .NET 2015
  • 原文地址:https://www.cnblogs.com/swobble/p/7083878.html
Copyright © 2011-2022 走看看