C#中的深复制和浅复制

最近在学习工作的生活中,在写代码过程中有这样一个需求,需要对一个对象进行复制,在改变复制后的对象的数据的时候不要改变原本的值的数据,于是便上网搜索相关的资料解决了问题。

众所周知,值类型(Value Type)(如 char、int 和 float)、枚举类型和结构类型。

引用类型(Reference Type) 包含类 (Class) 类型、接口类型、委托类型和数组类型。

他们的区别在于:

1,值类型的变量直接包含其数据,

2,引用类型的变量则存储对象引用。

对于引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能影响另一个变量所引用的对象。对于值类型,每个变量都有自身的数据副本,对一个变量的操作不可能影响另一个变量。

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

堆是一种先进先出的数据结构,而栈是后进先出,变量会被分配在堆栈上来执行 操作。

堆(heap)是用于为类型实例(对象)分配空间的内存区域,在堆上建立一个对象,

会将对象的地址传给堆栈上的变量(反过来叫变量指向此对象,或者变量引用此对象)。

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

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

深copy :深copy 与浅copy 不一样的是对于引用字段的处理,深copy
将会在新对象中建立一个新的对象和原始对象中对应字段相似(内容相似)的字段,也就是说这个引用和原始对象的引用是不一样,
咱们改动新对象中这个字段的时刻是不会影响到原始对象中对应字段的内容。

浅复制: 实现浅复制须要运用 Object类的MemberwiseClone要领用于建立一个浅表副本

深复制: 须实现 ICloneable接口中的Clone要领,且须要须要克隆的对象加上[Serializable]特征


class DrawBase:System.Object , ICloneable

{

   public string name = "jmj";

   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 = "a9fs3";

   Console.WriteLine(rect.name);

   DrawBase ploy = line.Clone() as DrawBase;

   ploy.name = "lj";

   Console.WriteLine(rect.name);

   Console.WriteLine(object.ReferenceEquals(line, ploy));

   Console.ReadLine();

  }

}

  运行结果:

  return this as object;      //引用同一个对象

  输出:jmj

  a9fs3

  lj

  True

  return this.MemberwiseClone(); //浅复制

  return new DrawBase() as object;//深复制

  输出均为: jmj

  jmj

  jmj

  False

  解释:

  return this as object 方法总是引用同一个对象,因此相应的堆内存上的值会改变!

  后两种方法都是对对象的复制,区别在于复制的类别不同:深复制会复制整个填充的对象,包括该对象中其他引用类型和值类型的值;而浅复制只复制了一个对象中所有引用,它没有值的复制,通过引用它们的其他对象的引用来共享它

时间: 2024-10-20 07:35:58

C#中的深复制和浅复制的相关文章

OC 中 的copy 功能 深复制 和 浅复制 的 区别

系统的类要是实现copy拷贝的功能,必须先签订拷贝NSCopying的协议,然后实现对应的方法 在.h文件中得@interface Boy : NSObject 的后面需要签订拷贝NSCopying的协议 例子: 在.h文件中 @interface Boy : NSObject<NSCopying> 1. Boy类使用copy的方法 例子: Boy *boy =[Boy boyWithName:@"zhangyangyang" hobby:@"wan"]

.NET中深复制与浅复制

概述: 在.NET里面,提供对象复制的功能,前提是实现ICloneable接口.ICloneable接口中有一个Clone方法, 可以在类中覆写实现自定义的拷贝方法.对象复制的实现方法有两种:深复制和浅复制. 深复制和浅复制: 浅复制,浅复制是指源对象与复制出来的对象共用一份实体,对其中任何一个对象的改动都会影响另外一个对象.相当于复制了指针. 深复制:指源对象与复制对象互相独立,为新对象重新分配了一段内存空间,并复制源对象的内容.其中任何一个对象的改动都不会对另外一个对象造成影响. 深浅复制与

(知其所以然 主题2)从底层分析OC中ARC和非ARC下深复制和浅复制

今天,在坊间听到有人在争论OC中关于NSString的深浅复制,听了下,感觉很有必要来一个分析总结,让我们从底层去了解OC中深浅复制的运作机制. 所谓copy就是在原有对象的基础上产生一个副本对象,遵循最关键的两点原则: 1. 改变原对象的属性和行为不会对副本对象产生任何影响 2. 改变副本对象的属性和行为不会对原对象产生任何影响 在理解了这一层之后,我们一起来研究下deep copy 和 shallow copy,因为苹果是一个非常注重性能的公司,所以拷贝在底层实现没那么简单: 以NSStri

Java中的clone()----深复制,浅复制

这篇文章主要介绍了Java中对象的深复制(深克隆)和浅复制(浅克隆) ,需要的朋友可以参考下 1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵深复制(深克隆) 被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量.那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象.换言之,深复制把要复制的对象所引用

java中的clone:深复制和浅复制

参考文章: java中的深复制和浅复制 : http://blog.csdn.net/naughty610/article/details/6598943 Java 深拷贝和浅拷贝: http://www.cnblogs.com/mengdd/archive/2013/02/20/2917971.html 

js中对象的复制,浅复制(浅拷贝)和深复制(深拷贝)

在js中,我们经常复制一个对象,复制数据,那么就会有人问了,怎么复制,今天鹏哥就带来js中的复制方法. JS中对象分为基本类型和复合(引用)类型,基本类型存放在栈内存,复合(引用)类型存放在堆内存. 堆内存用于存放由new创建的对象,栈内存存放一些基本类型的变量和对象的引用变量. 至于堆内存和栈内存的区别介绍,你们可以百度看看. 下面开始讲解复制: 这种只是简单的变量,内存小,我们直接复制不会发生引用. var a=123; var b=a; a=123456; alert(a); //1234

js中的深复制和浅复制

在实际情况中经常会遇到对对象复制的问题.比如在处理项目中的一笔多结构的数据存储或者调用,这个时候你就要对对象(json)进行操作,而不同的操作根据不同的需求来定义.其中最常见最普遍的是对对象的复制,重新定义,扩展等.下面我们正对这些问题来进行探讨.要了解对象,我们首先需要了解js的内存分配机制: var o = {a:1};当我们在给一个变量赋值的时候已经在浏览器中开辟了一块内存出来.这块内存在浏览器中占了一定的空间,这个时候,我们可以称变量 o 为栈,称{a:1}为堆,他们之间的关系可以用下面

iOS 集合的深复制与浅复制

概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制就是内容拷贝. 集合的浅复制 (shallow copy) 集合的浅复制有非常多种方法.当你进行浅复制时,会向原始的集合发送retain消息,引用计数加1,同时指针被拷贝到新的集合. 现在让我们看一些浅复制的例子: NSArray *shallowCopyArray = [someArray cop

深复制与浅复制

概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制就是内容拷贝. 集合的浅复制 (shallow copy) 集合的浅复制有非常多种方法.当你进行浅复制时,会向原始的集合发送retain消息,引用计数加1,同时指针被拷贝到新的集合. 现在让我们看一些浅复制的例子: NSArray *shallowCopyArray = [someArray cop

C++学习基础七——深复制与浅复制

一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和char *str两个成员变量, 当深复制时,A中的指针str与B中的指针str指向不同的地址,只是地址所指向的数据相同. 当浅复制时,A中的指针str与B中的指针str指向相同的地址. 1.浅复制:如果我们自己不实现复制构造函数,则C++会自动合成一个复制构造函数,又称为浅复制构造函数. 2.深复制:如果使用指针或者系统资源(如数据库