问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求助深拷贝和浅拷贝的问题

发布网友 发布时间:2022-04-21 07:45

我来回答

1个回答

热心网友 时间:2022-05-15 01:09

浅拷贝就比如像引用类型,而深拷贝就比如值类型。
浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三缺胳膊少腿还是李四缺胳膊少腿,都是这个人倒霉。
深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人。比较典型的就是Value(值)对象,如预定义类型Int32,Double,以及结构(struct),枚举(Enum)等。

C#中有两种类型变量,一种 是值类型变量,一种是引用类型变量。对于前者,copy是属于全盘复制;而对于后者,一般的copy只是浅copy,相当于只传递一个引用指针一样。因此 对于后者进行真正copy的时候,也是最费事的,具体的说,必须为其实现ICloneable接口中提供的Clone方法。

浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用.
深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.

浅 拷贝和深拷贝之间的区别:浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象 中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化。深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一 个新的和原是对象中对应字段相同(内容相同)的字段,也就是说这个引用和原是对象的引用是不同的,我们在改变新对象中的这个字段的时候是不会影响到原始对 象中对应字段的内容。所以对于原型模式也有不同的两种处理方法:对象的浅拷贝和深拷贝。

MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用 类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。深拷贝,即实现ICloneable接口.ICloneable可用于深拷贝 和浅拷贝。
这些都是概念,但是需要我们理解,下面介绍实例:

using System;
using System.Collections.Generic;
using System.Text;

namespace WindowsApplication1
{
public class ClassA:ICloneable
{
public int Value = 0;
public object Clone()
{
return this.MemberwiseClone();
}
}

public class ClassB:ICloneable
{
public ClassA Member= new ClassA();
public object Clone()
{
//浅复制
//return this.MemberwiseClone();

//深复制
ClassB obj= new ClassB();
//obj.Member= (ClassA)Member.Clone();
return obj;
}
}

public class class4
{
public static void Main()
{
ClassB sb = new ClassB();
sb.Member.Value = 15;

ClassB nb = (ClassB)sb.Clone();
nb.Member.Value = 6;
Console.Write(sb.Member.Value.ToString() + "---" + nb.Member.Value.ToString());
ClassA nnb = new ClassA();
nnb.Value = 111;
ClassA bbn = new ClassA();
bbn = (ClassA)nnb.Clone();
bbn.Value = 222;
Console.Write(bbn.Value);
Console.Read();

}
}
}

其中.MemberwiseClone()在上面已经介绍过了,通过实例可以清楚看到浅拷贝与深拷贝的区别
再来个:

using System;
using System.Collections.Generic;
using System.Text;

namespace WindowsApplication1
{
class Program
{
public class Sex
{
private string _PSex;
public string PSex
{
set
{
_PSex = value;
}
get
{
return _PSex;
}
}

}

public class Person : ICloneable
{

private Sex _pSex = new Sex();
public int aa = 1213;

public string pSex
{
set
{
_pSex.PSex = value;
}
get
{
return _pSex.PSex;
}
}
private string _PName;
public string PName
{
set
{
this._PName = value;
}
get
{
return this._PName;
}
}

public void ShowPersonInfo()
{
Console.WriteLine("-------------------------");
Console.WriteLine("Name:{0} Sex:{1}", _PName, this.pSex);
Console.WriteLine("-------------------------");
Console.WriteLine(this.aa);
}
//浅拷贝
public object Clone()
{
return this.MemberwiseClone();
}
//深拷贝
public object DeepClone()
{
Person newP = new Person();
newP.PName = this._PName;
newP.pSex = this.pSex;
return newP;
}

}

static void Main(string[] args)
{
Console.WriteLine("原对象:");
Person p = new Person();
p.PName = "JackLee";
p.pSex = "男";

p.ShowPersonInfo();

//浅拷贝
Person copy = (Person)p.Clone();
//深拷贝
Person dcopy = (Person)p.DeepClone();

Console.WriteLine("修改后的原对象:");
p.PName = "JackZhao";
p.pSex = "女";
p.aa = 1111;
p.ShowPersonInfo();

Console.WriteLine("修改后的浅拷贝对象:");
copy.ShowPersonInfo();
Console.WriteLine("修改后的深拷贝对象:");
dcopy.ShowPersonInfo();

Console.WriteLine("直接拷贝对象:");
Person PP = p;
PP.ShowPersonInfo();

Console.ReadLine();

}

}
}

接下来介绍一下数组的拷贝:
首先数组的直接拷贝也就是复制,不用多说看例子:

int [] numbers = { 2, 3, 4, 5};

int [] numbersCopy = numbers;

numbersCopy[2] = 0;

Console.Write(numbers[2]);

Console.Write(numbersCopy[2]);

结果就是
0
0
道理很简单,数组的复制也就是引用传递,指向的是同一个地址,这不是我们介绍的重点
接下来
看一下概念
数组是引用类型,所以将一个数组变量赋予另一个数组变量,就会得到两个指向同一数组的变量。而复制数组,会使数组实现ICloneable接口。这个接口定义的Clone()方法会创建数组的浅副本。
如果数组的元素是值类型,就会复制所有的值,如果数组包含引用类型,则不复制元素,而只复制引用,

除了使用Clone()方法之外,还可以使用Array.Copy()方法创建浅副本。但Clone()方法和Copy()方法有一个重要区别:Clone()方法会创建一个新数组,而Copy()方法只是传送了阶数相同、有足够元素空间的已有数组。
提示:
如果需要包含引用类型的数组的深副本,就必须迭代数组,创建新对象。
看一下例子:

using System;
using System.Collections.Generic;
using System.Text;

namespace WindowsApplication1
{
class Class2
{
public static void Main()
{
int[] numbers = { 2, 3, 4, 5 };

int[] numbersCopy = new int[5];

numbers.CopyTo(numbersCopy,0);

numbersCopy[2] = 0;

int[] numbers1 = { 2, 3, 4, 5 };

int[] numbersClone1 = (int[])numbers1.Clone();

numbersClone1[2] = 0;

Console.Write(numbers[2] + "---" + numbersCopy[2]);

Console.Read();

}
}
}

我这里介绍的主要是数组的clone和copyto的用法,两者都不会改变其中的值,与上面我们的复制有很大的区别
浅拷贝与深拷贝的区别

浅拷贝与深拷贝的区别:浅拷贝是指创建一个新对象,这个对象有着原始对象的一些引用类型的属性值的初始引用,也就是说,新对象和原始对象共享某些数据。修改浅拷贝对象的这些引用属性时,会影响到原始对象中的相应数据。但对于对象内部的非引用类型属性,如数字、字符串等,浅拷贝会创建这些属性的独立副本...

python的深拷贝和浅拷贝

对于不可变对象,浅拷贝和深拷贝都是相同的。浅拷贝只会复制可变对象的一层内容,而不会递归复制可变对象包含的子对象。如果需要递归复制子对象,必须使用深拷贝。当一个对象包含循环引用时,尝试进行深复制可能会导致无限递归,从而导致程序崩溃。因此,在使用深拷贝时,必须小心处理包含循环引用的对象。在...

什么是深拷贝和浅拷贝

浅拷贝就是指对象复制的时候只复制一层;深拷贝是指复制对象的所有层级。深拷贝和浅拷贝,主要是对象发生复制的时候,根据复制的层级不同来区分的。很多人在这里经常变量赋值发生混淆。对于JavaScript数组等复杂的数据类型来说,将其赋值给其它变量,其实只是复制了对象的地址给它,两个变量指向的是同一个...

python深拷贝和浅拷贝的区别

1、浅拷贝(shallow copy)所谓“浅拷贝”,是指创建一个新的对象,其内容是原对象中元素的引用。(拷贝组合对象,不拷贝子对象)常见的浅拷贝有:切片操作、工厂函数、对象的copy()方法、copy模块中的copy函数。2、深拷贝(deep copy)所谓“深拷贝”,是指创建一个新的对象,然后递归的拷贝原对象所包含...

面试官:老是问我深浅拷贝问题,自己看文章

面试官常问深浅拷贝问题,深入了解拷贝机制。探索深浅拷贝概念,理解其在对象拷贝中的作用。浅拷贝:复制对象的值,两个变量共享同一存储地址。深拷贝:创建新对象,与原对象无关联,独立存储。比较赋值与深浅拷贝,了解引用关系与独立性。浅拷贝方法:使用Object.assign()、lodash的_.clone方法、展开运算...

深拷贝和浅拷贝的区别

1、浅拷贝 a、Object.assign()Object.assign()方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。Object.assign()拷贝的是对象的属性的引用,而不是对象本身。2、深拷贝 a、JSON转换 let newObj = JSON.parse(JSON.stringify(obj))。缺点:1) 如果对象有函数,函数无法被...

死磕Java面试系列:深拷贝与浅拷贝的实现原理

浅拷贝的实现与局限浅拷贝通过实现`Cloneable`接口和重写`clone`方法实现。例如,字符串和基本类型拷贝不会影响原对象,但引用类型(如`Job`)由于共享堆内存地址,修改拷贝会影响原对象。深拷贝的实现策略深拷贝有多种方法:实现`Cloneable`接口、JSON字符串转换或通过集合构造函数。下面以几种方式举例:实...

python深拷贝和浅拷贝的区别

python深拷贝和浅拷贝的区别是:1、直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变。2、copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变。3、深拷贝,包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变。Python的语句不同...

什么是深拷贝和浅拷贝

浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值。但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件。。当值拷贝的时候,两个对象就有用共同的资源,同时对资源可以访问,这样就会出问题。深拷贝就是用来解决这样的问题的,它把资源也赋值一次,使对象...

聊聊我对C++深拷贝与浅拷贝的理解

浅拷贝的问题表现在:首先,指针指向同一内存,析构时可能导致资源析构多次,引发崩溃;其次,对象的修改会同步影响到其他对象,破坏数据独立性;最后,浅拷贝可能导致obj1.m_data的原始内存未被正确释放,形成内存泄漏。在深拷贝中,对象会在堆内存中分配新的空间,避免这些问题。比如类string的拷贝构造...

深拷贝和浅拷贝的题 js的深拷贝和浅拷贝的区别 深拷贝和浅拷贝的方法 浅拷贝和深拷贝的区别 c深拷贝和浅拷贝的区别 python的浅拷贝和深拷贝 java中的浅拷贝和深拷贝 数组浅拷贝和深拷贝的区别 浅拷贝和深拷贝什么时候用
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
肾结石对肾功能有什么影响 肾结石会影响肾功能吗 肾结石有后遗症吗 肾结石有什么影响 龚琳娜大事年表 龚琳娜音乐作品 龚琳娜的歌(全部) ...她说做不了好朋友,还可以做朋友,是什么意思啊!以后还 ..._百度... ...Out )攻略_荒野行动卡在登陆界面怎么办 卡屏解决方法 “柳色和愁为重折”的出处是哪里 深拷贝和浅拷贝怎样理解(通俗具体点儿) 什么是深拷贝和浅拷贝 浅拷贝与深拷贝的区别 阳光融和医院是阳光保险的吗? 阳光融和医院做的好么? 阳光融和医院跟阳光保险有关系吗? 山东阳光融和医院有限责任公司怎么样? 阳光保险的阳光融和医院获得国际JCI认证了吗? 阳光融和医院是阳光保险建的吗? 听说阳光融和医院是阳光保险近年成立的? 听说阳光融和医院是阳光保险创办的? 听说阳光融和医院是阳光保险做的? 阳光保险创办阳光融和医院了吗? 听说阳光融和医院是阳光保险创办的?是这样的吗 潍坊阳光融合医院招聘吗 是阳光保险成立的阳光融和医院么? 阳光保险的阳光融和医院很好吗?谢谢了。 山东阳光融和医院有限责任公司电话是多少? 阳光融和医院是阳光保险的么? 阳光保险的阳光融和医院是三甲的吗? 转:C#之深拷贝和浅拷贝的区别 什么是浅拷贝(shallow copy)和深拷贝(deep copy) java深拷贝和浅拷贝的区别 C#浅拷贝与深拷贝区别 net中浅拷贝和深拷贝有什么区别,分别如何实现 js深拷贝和浅拷贝的区别 JAVA 中浅拷贝与深拷贝有什么区别? 深拷贝和浅拷贝的区别 新房装修卫生间用蹲坑好还是马桶好 卫生间装马桶好还是蹲便好,看完这些之后再也不用纠结 卫生间是装马桶还是装蹲便器好 卫生间到底装马桶好还是蹲厕好? 卫生间在装修的时候,安装马桶比较好还是蹲坑比较好? 经验,卫生间到底装马桶好还是蹲坑好 卫生间装蹲便器好还是马桶好? 蹲坑和马桶,你家卫生间装修选择哪个 卫生间装修选蹲便器好还是马桶好 卫生间到底装蹲坑还是马桶好,家用马桶和蹲坑哪个好 新房装修卫生间装马桶好还是蹲坑好 卫生间装马桶好还是蹲坑好?聪明人这么选,水费至少省一半!