zoukankan      html  css  js  c++  java
  • C#中的深复制和浅复制

    最近开发中对泛型数据进行排序,但是还需要用到原始数据,所以就复制了该对象到另一个对象,忘记了引用类型是传地址的,所以出了bug,转贴一篇文章,记录一下自己的错误。

    C# 支持两种类型:“值类型”和“引用类型”。 
    值类型(Value Type)(如 char、int 和 float)、枚举类型和结构类型。 
    引用类型(Reference Type) 包括类 (Class) 类型、接口类型、委托类型和数组类型。

    如何来划分它们?
    以它们在计算机内存中如何分配来划分

    值类型与引用类型的区别?
    1,值类型的变量直接包含其数据,
    2,引用类型的变量则存储对象引用。
    对于引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能影响另一个变量所引用的对象。对于值类型,每个变量都有自己的数据副本,对一个变量的操作不可能影响另一个变量。

    值类型隐式继承自System.ValueType  所以不能显示让一个结构继承一个类,C#不支持多继承

    堆栈(stack)是一种先进先出的数据结构,在内存中,变量会被分配在堆栈上来进行操作。
    堆(heap)是用于为类型实例(对象)分配空间的内存区域,在堆上创建一个对象,
    会将对象的地址传给堆栈上的变量(反过来叫变量指向此对象,或者变量引用此对象)。

    关于对象克隆的所设计到知识点

    浅拷贝:是指将对象中的所有字段逐字复杂到一个新对象
            对值类型字段只是简单的拷贝一个副本到目标对象,改变目标对象中值类型字段的值不会反映到原始对象中,因为拷贝的是副本
            对引用型字段则是指拷贝他的一个引用到目标对象。改变目标对象中引用类型字段的值它将反映到原始对象中,因为拷贝的是指向堆是上的一个地址

    深拷贝:深拷贝与浅拷贝不同的是对于引用字段的处理,深拷贝将会在新对象中创建一个新的对象和
            原始对象中对应字段相同(内容相同)的字段,也就是说这个引用和原始对象的引用是不同, 我们改变新
            对象中这个字段的时候是不会影响到原始对象中对应字段的内容。

    浅复制: 实现浅复制需要使用Object类的MemberwiseClone方法用于创建一个浅表副本
    深复制: 须实现 ICloneable接口中的Clone方法,且需要需要克隆的对象加上[Serializable]特性

    两篇帖子原文:http://www.cnblogs.com/huangting2009/archive/2009/03/13/1410634.html 
    还有:http://blog.csdn.net/ifooler/archive/2007/05/06/1598452.aspx

    有些时候我们也可以利用这个特性来实现一些功能。以下是我在开发中遇到的一个问题。

    有一个复杂对象(类里有对象),自己本身有一些属性,还有对象属性。我需要在一定条件下改变这个对象的一些string类型的属性,但还必须得有一个副本保存我原来的对象。即必须有两个对象,其中大部分属性是一样的,但是有些string属性需要改变。这个时候,我就利用了浅复制。只是将对象浅复制一份,为了表述方便称源对象为A,复制出来的对象为B,A、B中的string类型的属性c是不一样的,但其他属性一样。浅复制之后,A、B中的对象属性d其实是一个东西,我无论改变A、B中的任何一个都可以改变两个。这样我就不需要再进行一遍赋值了。

    可能我说的不是太明白~~~

  • 相关阅读:
    【HDOJ】2267 How Many People Can Survive
    【HDOJ】2268 How To Use The Car
    【HDOJ】2266 How Many Equations Can You Find
    【POJ】2278 DNA Sequence
    【ZOJ】3430 Detect the Virus
    【HDOJ】2896 病毒侵袭
    求奇数的乘积
    平方和与立方和
    求数列的和
    水仙花数
  • 原文地址:https://www.cnblogs.com/lzxianren/p/2883196.html
Copyright © 2011-2022 走看看