深度复制与浅度复制

浅度复制:只是复制类的值类型字段和引用类型字段的引用

深度复制:即完全复制过来,不管里面的值类型字段还是引用类型字段,是构成一个全新的一模一样的对象。

代码:


 1 public class PersonInfo
2 {
3 public string Name{get;set;}
4 public int Age{get;set;}
5 }
6 public class Person : ICloneable
7 {
8 public PersonInfo PersonInfo { get; set; }
9 public Person(PersonInfo personInfo)
10 {
11 this.PersonInfo = personInfo;
12 }
13
14 /// <summary>
15 /// 浅度克隆
16 /// </summary>
17 /// <returns></returns>
18 public Person ShallowClone()
19 {
20 return this.MemberwiseClone() as Person;
21 }
22
23 /// <summary>
24 /// 深度复制(实现ICloneable接口的方法)
25 /// </summary>
26 /// <returns></returns>
27 public object Clone()
28 {
29 PersonInfo perInf = new PersonInfo { Name = this.PersonInfo.Name, Age = this.PersonInfo.Age };
30 Person per = new Person(perInf);
31 return per;
32 }
33
34 /// <summary>
35 /// 第二种深度复制
36 /// </summary>
37 /// <returns></returns>
38 public Person DeepClone()
39 {
40 using (var ms = new MemoryStream())
41 {
42 var formatter = new BinaryFormatter();
43 formatter.Serialize(ms, this);
44 ms.Position = 0;
45 return (Person)formatter.Deserialize(ms);
46 }
47 }
48 }

引用:深度复制问题..当对象成员有很多引用成员,如何深度复制。

时间: 2024-10-08 14:17:51

深度复制与浅度复制的相关文章

.NET基础之深度复制和浅度复制

之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉. 大家都知道Object是所有类共同的基类,其有个方法是MemberwiseClone(),其用途为 我们可以通过这个方法来达到浅度复制的效果. 下面我们通过一个例子来阐述一下浅度复制,其与深度复制的区别在什么地方: public class Content { public int Val; } public class Cloner { public Content MyContent = ne

转载---Java集合对象的深度复制与普通复制

原博文:http://blog.csdn.net/qq_29329775/article/details/49516247 最近在做算法作业时出现了错误,原因是没有弄清楚java集合的深度复制和浅度复制的区别. 1.首先是对Java集合对象得浅复制与深度复制的理解 普通的集合复制只是将内存中栈的地址快拷贝一份,使得一个新的集合对象指向这个地址块,但是集合中的对象变量却是指向堆中的同一块区域.所以当拷贝的集合修改了集合对象内的数据,那么源集合对象也就随之改变了,这样的效果我们称之为Java集合对象

浅度复制VS深度复制

对于引用类型的复制,通过MemberwiseClone()复制的只是引用,即myclone1和myclone2的myContent是相同的对象实例.一个改变值,另一个也会改变.因为myContent.Val是公共字段. 值对象则没有这种顾虑 PS:感觉ICloneable 接口并没有什么用,完全可以自己写方法.毕竟ICloneable里面只有一个Clone方法. 代码如下: 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 C

类的浅度复制和深度复制

现在我们定义一个类 //name.h class name { private: char *str; int len; static in num_name; //全局变量,不能在声明中初始化.(因为声明描述了如何分配内存,但不分配内存). public: name(); name(const char* s); name(const name& s); ~name(); } //name.cpp #include <cstring> #include <iostream>

深度解析javascript中的浅复制和深复制

原文:深度解析javascript中的浅复制和深复制 在谈javascript的浅复制和深复制之前,我们有必要在来讨论下js的数据类型.我们都知道有Number,Boolean,String,Null,Undefined,Object五种类型.而Object又包含Function,Array和Object自身.前面的五种类型叫做基本类型,而Object是引用类型.可能有人就要问,为什么要分基本类型和引用类型呢?后面你就会明白的. 我们首先来看看浅复制和深复制的简洁定义: 深复制:直接将数据复制给

也来谈一谈js的浅复制和深复制

1.浅复制VS深复制 本文中的复制也可以称为拷贝,在本文中认为复制和拷贝是相同的意思.另外,本文只讨论js中复杂数据类型的复制问题(Object,Array等),不讨论基本数据类型(null,undefined,string,number和boolean),这些类型的值本身就存储在栈内存中(string类型的实际值还是存储在堆内存中的,但是js把string当做基本类型来处理 ),不存在引用值的情况. 浅复制和深复制都可以实现在已有对象的基础上再生一份的作用,但是对象的实例是存储在堆内存中然后通

js中的深复制和浅复制

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

Java对象深复制、浅复制

我们在编码过程经常会碰到将一个对象传递给另一个对象,java中对于基本型变量采用的是值传递,而对于对象比如bean传递时采用的引用传递也就是地址传递,而很多时候对于对象传递我们也希望能够象值传递一样,使得传递之前和之后有不同的内存地址,在这种情况下我们一般采用以下两种情况. 浅复制与深复制概念 浅复制(浅克隆) :被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. 深复制(深克隆) :被复制对象

C#使用反射(Reflection)实现深复制与浅复制

原文路径:https://blog.csdn.net/qq_28839293/article/details/79487294 1.浅复制: class Program { public static void Main(string[] args) { var classA1 = new ClassA { a = 1, b = "haha", d = new ClassB{ c ="haha" } }; var classA2 = (ClassA)classA1.