C#类型基础----对象复制

C#类型基础----对象复制

 

前言

有的时候,创建一个对象可能会非常耗时,比如对象需要从远程数据库中获取数据来填充,又或者创建对象需要读取磁盘文件.此时,如果已经有了一个对象,再创建新对象时,可能会采用复制现有对象的方法,而不是重新建一个新的对象.本次内容,咱们就一起探讨一下关于对象的复制.

 

正文

 

浅度复制

浅度复制和深度复制是以如何复制对象的成员来区分的.对象的成员有可能是值类型,有可能是引用类型.当对对象进行一个浅度复制的时候,对于值类型成员,会赋值其本身(值类型变量本身包含了所有数据,复制时进行按位复制);对于引用类型成员(注意它实际上只是一个对象引用,指向了堆上的对象实例),仅仅复制引用,而不是在堆上重新创建对象.因此,浅度复制结果就是:新对象的引用成员和复制对象的引用成员指向了同一个对象.

 

继续上面的例子,如果想要进行复制的对象(RefLine)是这样定义的,(为了避免翻看前面的代码,这里把代码再贴过来):

    public class RefPoint
    {
        public int x;
        public RefPoint(int x)
        {
            this.x = x;
        }
 
    }
 
    public struct ValPoint
    {
        public int x;
        public ValPoint(int x)
        {
            this.x = x;
        }
    }
    public class RefLine
    {
        public RefPoint rPoint;
        public ValPoint vPoint;
        public RefLine(RefPoint rPoint, ValPoint vPoint)
        {
            this.rPoint = rPoint;
            this.vPoint = vPoint;
        }
}
 

先创建一个想要复制的对象

            RefPoint rPoint = new RefPoint(1);
            ValPoint vPoint = new ValPoint(1);
            RefLine line = new RefLine(rPoint, vPoint);

该对象的实例效果如下所示:

 

 

 

那么当对此对象进行复制时,就会向下图这样(newLine是指向新复制的对象的指针,在代码中体现为一个引用类型的变量).

 

 

按照这个定义,在会议上面讲到的内容,可以推出一个结论:当复制一个结构类型成员的时候,直接创建一个新的结构类型变量,然后对它赋值,就相当于进行了一个浅度复制,也可以认为结构类型隐式地实现了浅度复制.如果将上面的RefLine定义为一个结构(Struct),结构类型为ValLine,而不是一个类,那么对它进行浅度复制就可以这样:

ValLine newLine=line;

如下图所示:

 

 

现在差不多应该能清楚啥叫浅度复制了吧,知道了如何对结构进行浅度复制.那么如何对一个引用类型实现浅度复制呢?.NET Framework,有一个ICloneable接口,我们可以实现这个接口来进行浅度复制.这个接口只要求实现一个Clone(),它返回当前对象的副本.我们并不需要自己实现这个方法,System.Object基类中,有一个保护的MemberwiseClone()方法,它便用于进行浅度复制.所以,对于引用类型,要想实现浅度复制,只需要调用这个方法就可以了:

        public object Clone()
        {
            return MemberwiseClone();
        }

深度复制

其实到现在大概可能已经想到啥叫深度复制了,深度复制就是将引用成员指向的对象也进行复制.实际的过程是创建新的引用成员指向的对象,然后复制对象中所包含的数据.

深度复制可能会变得非常复杂,因为引用成员指向的对象可能包含另一个引用类型成员,最简单的例子就是一个线性链表.

如果一个对象的成员包含了对于线性链表结构的一个引用,浅度复制只复制了对头节点的引用,深度复制则会复制链表本身,并复制每个节点上的数据.

 

总结

 

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

如果你拷贝的对象中引用了某个外部的内容(比如分配在堆上的数据),那么在拷贝这个对象的时候,让新旧两个对象指向同一个外部的内容,就是浅拷贝;如果在拷贝这个对象的时候为新对象制作了外部对象的独立拷贝,就是深拷贝

引用和指针的语义是相似的,引用是不可改变的指针,指针是可以改变的引用。其实都是实现了引用语义。

深拷贝和浅拷贝的区别是在对象状态中包含其它对象的引用的时候,当拷贝一个对象时,如果需要拷贝这个对象引用的对象,则是深拷贝,否则是浅拷贝。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验一 一、实验目的 1、熟悉ASP.NET 4.0网站开发运行环境及配置 2、掌握创建网站、发布网站、复制网站的过程 3、掌握网站设置和虚拟目录设置的过程 二、实验内容及步骤 三、实验总结 实验二 一、实验目的 1、掌握C#基础语法(值类型、引用类型、装箱和拆箱) 2、流程控制(case、while、 for、foreach) 3、创建C#类StudentInfo并应用于ASP.NET 4.0 Web窗体中 二、实验内容及步骤 三、实验总结 实验三 一、实验目的 1、理解ASP.NET 4.0页面事件处理流程 2、掌握ASP.NET 4.0标准控件的应用 二、实验内容及步骤 设计并实现一个简易计算器,实现加减乘除的功能。 三、实验总结 实验四 一、实验目的 1、掌握HttpRequest、HttpResponse对象的应用 2、掌握至少三种跨页面提交的方法 3、掌握Cookie、Session、Application应用 二、实验内容及步骤 三、实验总结 实验五 一、实验目的 1、掌握VisualStudio2013中管理数据库的方法(启动服务,连接数据库,建库,建表) 2、掌握数据源控件(SQLDataSource)的使用 3、掌握数据绑定控件(GridView)的使用 二、实验内容及步骤 三、实验总结 实验六 一、实验目的 1、了解ADO.NET 结构和ADO.NET 的组件 2、掌握Command、Connection、DataSet、DataAdapter和DataReader 对象的使用 3、掌握项目多层架构的组成 二、实验内容及步骤 利用ADO.NET对数据库的操作,实现注册和登录功能。 三、实验总结 ----------------------- 实验目的-实验内容-实验报告全文共2页,当前为第1页。 实验目的-实验内容-实验报告全文共2页,当前为第2页。
地大《计算机文化基础》在线作业一-0011 关闭一个活动应用程序窗口,可按快捷键( ) A:Alt + F4 B:Ctrl + F4 C:Alt + ESC D:Ctrl + ESC 答案:A 在编辑文档时,需在输入新的文字的同时替换原有文字,最快捷的操作步骤是( ) A:直接输入新内容 B:选定需替换的内容,直接输入新内容 C:选用Delete删除需替换的内容,再输入新内容 D:无法同时实现 答案:B 在Windows中,通过()可以访问局域网上与之相连的其他计算机上的信息。 A:我的电脑 B:我的文档 C:网上邻居 D:Outlook 答案:C Excel可以建立不同类型的图表,但其中不可建立的图表类型有( ) A:饼图 B:雷达图 地大《计算机文化基础》在线作业一-0011全文共7页,当前为第1页。C:矩阵图 地大《计算机文化基础》在线作业一-0011全文共7页,当前为第1页。 D:XY(散点)图 答案:C 进入幻灯片各种视图最快的方法是( ) A:选择菜单"视图" B:使用快捷菜单 C:单击屏幕左下方的"视图控制" D:使用快捷键Ctrl+C 答案:C WEB页面是由( )语言编写的 A:HTTP B:C# C:Java D:HTML 答案:D ()组中的两个软件都属于系统软件 A:Windows和MIS B:Windows和Linux C:UNIX和MIS D:Word和Excel 答案:B 目前使用的防病毒软件的作用是() A:查出任何已感染的病毒 B:查出并清除任何病毒 地大《计算机文化基础》在线作业一-0011全文共7页,当前为第2页。C:清除已感染的任何病毒 地大《计算机文化基础》在线作业一-0011全文共7页,当前为第2页。 D:查出已知的病毒,清除部分病毒 答案:D 在微型计算机中,应用最普遍的字符编码是() A:ASCII码 B:BCD码 C:汉字编码 D:补码 答案:A 一个完整的计算机体系包括() A:主机、键盘和显示器 B:计算机与外部设备 C:硬件系统和软件系统 D:系统软件与应用软件 答案:C 选定某个文件后,可以采用()的方法移动该文件。 A:剪切 B:粘贴 C:复制+粘贴 D:剪切+粘贴 答案:D 在Excel的工作表中,每个单元格都有其固定的地址,如"D8"表示( ) A:"D"代表"D"列,"8"代表第"8"行 B:"D"代表"D"行,"8"代表第"8"列 地大《计算机文化基础》在线作业一-0011全文共7页,当前为第3页。C:"D8"代表单元格的数据 地大《计算机文化基础》在线作业一-0011全文共7页,当前为第3页。 D:以上都不是 答案:A 编辑幻灯片内容时,首先应() A:选择编辑栏工具按钮 B:选择编辑对象 C:选择菜单"编辑" D:选择菜单"视图" 答案:B Excel2000每张工作表中最多可容纳的数据行数为( )行 A:32000 B:1024 C:512 D:65536 答案:D IP地址指的是()。 A:接入因特网的计算机地址编号 B:因特网中网络资源的地理位置 C:因特网中的子网地址 D:接入因特网的局域网 答案:A 目前使用的微型计算机,其主要器件是由( )构成 A:电子管 B:晶体管 地大《计算机文化基础》在线作业一-0011全文共7页,当前为第4页。C:集成电路 地大《计算机文化基础》在线作业一-0011全文共7页,当前为第4页。 D:大规模集成电路 答案:D 在Word中,段落"缩进"后打印出来的文本,其文本相对于打印纸边界的距离为()。 A:页边距 B:缩进距离 C:悬挂缩进距离 D:页边距+缩进距离 答案:D 计算机内存中用于存取信息的部件是() A:硬盘 B:软盘 C:RAM D:ROM 答案:C 在演示文稿中新增一幻灯片最快的方法是( ) A:选择菜单"插入"中的"新幻灯片" B:单击工具栏上的"新幻灯片" C:使用快捷菜单 D:使用"内容提示向导" 答案:B 在Excel工作表的单元格中可以输入两类数据,它们是( ) A:常量和公式 地大《计算机文化基础》在线作业一-0011全文共7页,当前为第5页。B:数字、文字和图形 地大《计算机文化基础》在线作业一-0011全文共7页,当前为第5页。 C:文字和图片 D:文字和数字 答案:A TCP是()的缩写 A:传输控制协议 B:互联网协议 C:超文本传输协议 D:以上都不是 答案:A 在Word文档中插入图片后,可直接使用图片的快捷菜单进行编辑,打开图片快捷菜单的鼠标操作是( ) A:在图片上单击鼠标左按钮 B:按住鼠标右按钮拖动 C:按住鼠标左按钮拖动 D:在图片上单击鼠标右按钮 答案:D 下面关于Windows98快捷菜单的描述中,不正确的是( ) A:按ESC键或单击桌面或窗口上任一空白区域,就
C#基础类库 1.Chart图形 Assistant创建显示图像的标签和文件 OWCChart统计图的封装类 2.Cookie&Session;&Cache;缓存帮助类 CacheHelper C#操作缓存的帮助类,实现了怎么设置缓存,怎么取缓存,怎么清理缓存等方法,只需要调用方法就可以实现 CookieHelper C#操作Cookie的帮助类,添加Cookie,删除Cookie,修改Cookie,清理Cookie SessionHelper C#关于Session的操作,获取Session,设置Session,删除Session使用方便,只需要调用方法就可以了 SessionHelper2 C#关于Session的一些高级操作,比如取Session对象,取Session数据等等 3.CSV文件转换 CsvHelper CSV文件导入DataTable和DataTable导出到Csv文件等操作 4.DEncrypt 加密/解密帮助类 DEncrypt C#DEncrypt加密/DEncrypt解密帮助类 ,多种方式,可以设置Key DESEncrypt C#DESEncrypt加密/DESEncrypt解密帮助类 ,多种方式,可以设置Key Encrypt C#Encrypt--Encrypt加密/Encrypt解密/附加有MD5加密,个人感觉很不错的一个加密类 HashEncode 哈希加密帮助类,得到随机哈希加密字符串,随机哈希数字加密等 MySecurity MySecurity--Security安全加密/Security Base64/Security文件加密,以及一些常用的操作方法 RSACryption RSACryption--RSA加密/RSA解密字符串 RSA加密应用最多是银行接口,这里的方法可以直接使用哦 5.FTP操作类 FTPClient   FTPClient--FTP操作帮助类,FTP上传,FTP下载,FTP文件操作,FTP目录操作 FTPHelper FTPHelper-FTP帮助类,FTP常用操作方法,添加文件,删除文件等 FTPOperater FTP操作帮助类,方法比较多,比较实用 6.JS操作类 JsHelper JsHelper--Javascript操作帮助类,输出各种JS方法,方便不懂JS的人使用,减少代码量 7.JSON 转化类 ConvertJson List转成Json|对象转成Json|集合转成Json|DataSet转成Json|DataTable转成Json|DataReader转成Json等 8.Mime MediaTypes 电子邮件类型帮助类,规定是以Xml,HTML还是文本方式发送邮件 MimeEntity Mime实体帮助类 MimeHeaders mime的Header帮助类 MimeReader mime读取帮助类 QuotedPrintableEncoding mimeEncoding帮助类 9.PDF 转化类 PDFOperation PDFOperation--C#PDF文件操作帮助类 类主要功能有1.构造函数2.私有字段3.设置字体4.设置页面大小 5.实例化文档6.打开文档对象7.关闭打开的文档8.添加段落9.添加图片10.添加链接、点 等功能 10.ResourceManager 操作类 AppMessage app消息格式化类,返加字符串帮助类 ResourceManager C#一个操作Resource的帮助类 ResourceManagerWrapper Resources 操作Resources的帮助类,使用Api的方式 Sample.xml 11.XML操作类 XmlHelper 操作Xml文档的帮助类,主要是添加,删除,修改,查询节点的操作和操作后进行保存的功能。 XMLProcess 操作Xml文档的帮助类,主要是添加,删除,修改,查询节点的操作的功能。 12.弹出消息类 MessageBox JS弹出信息帮助类 ShowMessageBox 相对于MessageBox更丰富的提示类 13.导出Excel 操作类 DataToExcel

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值