您的当前位置:首页ASP.NET深度复制和浅度复制分析

ASP.NET深度复制和浅度复制分析

2022-06-15 来源:比拉宠物

本文深入浅出的分析了ASP.NET深度复制和浅度复制。分享给大家供大家参考。具体分析如下:

之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉。

如果大家不懂值类型和引用类型的区别,请先看//www.gxlcms.com/article/57471.htm,本来想自己写的,但刚好看到了这篇写的非常全面,就不自己写了。

大家都知道Object是所有类共同的基类,其有个方法是MemberwiseClone(),其用途为

我们可以通过这个方法来达到浅度复制的效果。

下面我们通过一个例子来阐述一下浅度复制,其与深度复制的区别在什么地方: 代码如下:public class Content{        public int Val;}public class Cloner{        public Content MyContent = new Content();

        public Cloner(int newVal)        {            MyContent.Val = newVal;        }        public object GetCopy()        {            return MemberwiseClone();        }}

在这里我们有两个类,一个Content类,只有一个为值类型int的Val,还有个类是一个Cloner类,其有一个Content类型的成员,然后有个构造函数可以初始化成员,最后有一个GetCopy的方法,通过MemberwiseClone方法来复制自己。

下面我们通过一段代码来调用Cloner类: 代码如下:static void Main(string[] args){    Cloner source = new Cloner(10);    Cloner target = (Cloner)source.GetCopy();//返回的是一个Object类型 需要做类型转换.    Console.WriteLine("target.MyContent.Val = {0}", target.MyContent.Val);    source.MyContent.Val = 15;    Console.WriteLine("target.MyContent.Val = {0}", target.MyContent.Val);    Console.ReadKey();}结果是:

我们可以看到我们通过GetCopy()函数复制类source给target,但是当我们改变source的时候,source输出的值也跟着改变。由此我们可以得出,我们通过MemberwiseClone()复制的只是引用,即source和target的MyContent是相同的对象实例。这就是浅度复制,那我们如何实现深度复制呢,在.NET Framework中,给我们提供了ICloneable接口。

首先我们看下ICloneable接口: 代码如下:// 摘要://     支持克隆,即用与现有实例相同的值创建类的新实例。[ComVisible(true)]public interface ICloneable{        // 摘要:        //     创建作为当前实例副本的新对象。        //        // 返回结果:        //     作为此实例副本的新对象。        object Clone();}

在上面那个例子中,我们只需要修改一些代码就可以了: 代码如下:public class Cloner:ICloneable{        public Content MyContent = new Content();

        public Cloner(int newVal)        {            MyContent.Val = newVal;        }        //public object GetCopy()        //{        //    return MemberwiseClone();        //}        public object Clone()        {            Cloner cloned = new Cloner(MyContent.Val);            return cloned;        }}

为了做区别我把之前的代码放在上面,注释了的代码就是浅度复制,后面的为深度复制,我们看到差别在于用本实例的MyContent.Val重新生成了实例返回给目标,测试结果为:

这里如果MyContent的成员不是一个值类型,那么我们还需要进行深度,像下面一样: 代码如下:public object Clone(){    Cloner cloned = new Cloner();    cloned.MyContent = MyContent.Clone();    return cloned;}深度复制和浅度复制就是这样,关键是创建一个新的对象实例返回去,而不是把原来的对象实例返回回去。

希望本文所述对大家的.NET程序设计有所帮助。

小编还为您整理了以下内容,可能对您也有帮助:

什么是深拷贝和浅拷贝

浅拷贝就是指对象复制的时候只复制一层;深拷贝是指复制对象的所有层级。

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

深拷贝和浅拷贝需要注意的地方就是可变元素的拷贝:

在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去。

而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。

C#对象的浅拷贝(浅表复制)和深拷贝(深度复制)是什么意思?

浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值。但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件。。当值拷贝的时候,两个对象就有用共同的资源,同时对资源可以访问,这样就会出问题。深拷贝就是用来解决这样的问题的,它把资源也赋值一次,使对象拥有不同的资源,但资源的内容是一样的。对于堆资源来说,就是在开辟一片堆内存,把原来的内容拷贝。如果你拷贝的对象中引用了某个外部的内容(比如分配在堆上的数据),那么在拷贝这个对象的时候,让新旧两个对象指向同一个外部的内容,就是浅拷贝;如果在拷贝这个对象的时候为新对象制作了外部对象的拷贝,就是深拷贝引用和指针的语义是相似的,引用是不可改变的指针,指针是可以改变的引用。其实都是实现了引用语义。深拷贝和浅拷贝的区别是在对象状态中包含其它对象的引用的时候,当拷贝一个对象时,如果需要拷贝这个对象引用的对象,则是深拷贝,否则是浅拷贝。

C#里.什么是浅度复制和深度复制?

有的时候,创建一个对象可能会非常耗时,比如对象需要从远程数据库中获取数据来填充,又或者创建对象需要读取硬盘文件。此时,如果已经有了一个对象,再创建新对象时,可能会采用复制现有对象的方法,而不是重新建一个新的对象。

浅度复制 和 深度复制 是以如何复制对象的成员(member)来划分的。一个对象的成员有可能是值类型,有可能是引用类型。当我们对对象进行一个浅度复制的时候,对于值类型成员,会复制其本身(值类型变量本身包含了所有数据,复制时进行按位拷贝);对于引用类型成员(注意它会引用另一个对象),仅仅复制引用,而不创建其引用的对象。结果就是:新对象的引用成员和 复制对象的引用成员 指向了同一个对象。

深度复制就是将引用成员指向的对象也进行复制。实际的过程是创建新的引用成员指向的对象,然后复制对象包含的数据。深度复制可能会变得非常复杂,因为引用成员指向的对象可能包含另一个引用类型成员,最简单的例子就是一个线性链表。如果一个对象的成员包含了对于线性链表结构的一个引用,浅度复制 只复制了对头结点的引用,深度复制 则会复制链表本身,并复制每个结点上的数据。

比拉宠物还为您提供以下相关内容希望对您有帮助:

C#里.什么是浅度复制和深度复制?

深度复制就是将引用成员指向的对象也进行复制。实际的过程是创建新的引用成员指向的对象,然后复制对象包含的数据。深度复制可能会变得非常复杂,因为引用成员指向的对象可能包含另一个引用类型成员,最简单的例子就是一个线性链表。如果一个对象的成员包含了对于线性链表结构的一个引用,浅度复制 只复制了对...

C#中引用类型和值类型的浅度复制和深度复制的问题?

这个方法提供的复制功能称为阴影复制,因为它没有考虑引用类型成员。因此,新对象中的引用成员就会指向与源对象中相同成员的对象,在许多情况下这并不理想。如果要创建成员的新实例,此时应复制值,而不复制引用,就需要使用深度复制。我们看下面一个例子,其中有一个值类型的域:public class Cloner { pu...

c#中,这个所谓的深度复制是复制了谁呢

深复制是针对浅表复制来说了,深复制是对复制的对象与原来的对象不是同一地址,与原对象没有关系。(虽然值是一样的。)浅表复制:复制是同一对象的引用地址,其实就是同一对象。你这题复制的是 自身对象的VAL 这个变量的值。

C#对象的浅拷贝(浅表复制)和深拷贝(深度复制)是什么意思?

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

由浅入深学ASP.NET内容简介

本书是一本深度剖析ASP.NET 4.0的入门指南,它以系统且详尽的内容著称,通过真实案例和丰富习题贯穿始终,是当前市场上难得的ASP.NET基础学习宝典。全书内容涵盖广泛,分为五个部分共计22章,旨在全面教授ASP.NET开发基础。首先,第1章“Web开发入门”引导读者理解ASP.NET Web开发的基本概念、理念和技术...

C#中深度复制和浅度复制的区别

C#中没有直接的深度复制,这个需要手动实现,浅表复制就是只复制第一层的值类型的值和引用类型的引用。你看这个浅表复制,就是在你改如图注释所示处的时候,也会修改cloner2.con.val的值,如果是深度复制,就不会。class Content{ public int val;} class Cloner{ public Content con = new...

在c#中,这里要实现深度复制,我画问号的那行为什么要添加,这行什么意思...

浅复制只能复制值类型,引用类型不复制。深复制是连引用类型一起复制。来看些代码:public class Person//人{public string Name{get;set;}//姓名public int Age{get;set;}//年龄public Company Company{get;set;}//公司,该变量为引用类型}public class Company//公司{public string CompanyName{get...

如何直观地理解机器学习领域的深度和浅度学习

这是因为在十几年前的硬件条件下,对高层次多节点神经网络的建模,时间复杂度(可能以年为单位)几乎是无法接受的。在很多应用当中,实际用到的是一些深度较浅的网络,虽然这种模型在这些应用当中,取得了非常好的效果(甚至是the state of art),但由于这种时间上的不可接受性,限制了其在实际应用的...

java深度拷贝和浅度拷贝的问题

是的,上面的clone方法也就是Object的Clone方法是浅表复制,看看他的API说的:“此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;……。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。 ”这你没理解错。但你测试的...

DataTable的Copy方法是深度复制还是浅复制

其实好像 DataTable dt1=dt.Copy();//就已经复制了dt的结构和数据 只不过操作dt和操作dt1变成一样的,这样不是你想要的目的 你想要的是下面的代码吧 /// /// 执行DataTable中的查询返回新的DataTable /// /// 源数据DataTable /// 查询条件 /// <returns></returns> public static ...

Top