我们都知道,在C#中,对于复杂对象,每声明一个牸类型的变量a,并用个该类型的对象A给这个变量赋值的时候,其实是让这个变量a指向了对象A,在内存中并没有多生成一个对象A的实例.所以不管我们声明多少个等于A的变量,其实际上永远都只有一个A存在于内存中.这就是我们常说的引用类型的特性.

引用类型的这一特性的好处是不言无喻的,然而,它也给我们带了一小点不便,那就是有时候,偶尔我们需要在内存中有两个所有属性值都一模一样的对象A和B,这样便于对B做操作而不影响到A.有人说那New两次不就有两个一模一样的对象了吗,其实,他没有考虑到在实际的操作过程中,对象A可能因为用户的操作,一些属性被改变了.New出来的对象只能确保初始状态类型和属性的一致性,对于运行时改变的属性它就无能为力了.也就是说,此时,我们得克隆一个A对象,把当前A对象的所有属性值取到新对象中去,这样就能保证当前两个对象的一致性.看代码吧:

/// <summary>
/// 克隆一个对象/// </summary>
/// <param name="o"></param>
/// <returns></returns>
private object CloneObject(object o)
{Type t =o.GetType();PropertyInfo[] properties =t.GetProperties();Object p =t.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, null, o, null);foreach(PropertyInfo pi in properties){if(pi.CanWrite){object value=pi.GetValue(o, null);pi.SetValue(p, value, null);}}return p;
}
调用代码生成新的一模一样的对象就很方便了,示例:TextBox t =(TextBox)CloneObject(textBox1);
当然,在实际使用的过程中,我发现上面的方法也是有缺陷的,比如在克隆DataGridView对象的时候,SetValue的时候会报错,其中的原因还有待分析.不过我们还有更专业的克隆DataGridView的方法:
/// <summary>
/// 专门克隆DataGridView的方法
/// </summary>
/// <param name="dgv"></param>
/// <returns></returns>
public static DataGridView CloneDataGridView(DataGridView dgv)
{try{DataGridView ResultDGV = new DataGridView();ResultDGV.ColumnHeadersDefaultCellStyle = dgv.ColumnHeadersDefaultCellStyle.Clone();DataGridViewCellStyle dtgvdcs = dgv.RowsDefaultCellStyle.Clone();dtgvdcs.BackColor = dgv.DefaultCellStyle.BackColor;dtgvdcs.ForeColor = dgv.DefaultCellStyle.ForeColor;dtgvdcs.Font = dgv.DefaultCellStyle.Font;ResultDGV.RowsDefaultCellStyle = dtgvdcs;ResultDGV.AlternatingRowsDefaultCellStyle = dgv.AlternatingRowsDefaultCellStyle.Clone();for (int i = 0; i < dgv.Columns.Count; i++){DataGridViewColumn DTGVC = dgv.Columns[i].Clone() as DataGridViewColumn;DTGVC.DisplayIndex = dgv.Columns[i].DisplayIndex;if (DTGVC.CellType == null){DTGVC.CellTemplate = new DataGridViewTextBoxCell();ResultDGV.Columns.Add(DTGVC);}else{ResultDGV.Columns.Add(DTGVC);}}foreach (DataGridViewRow var in dgv.Rows){DataGridViewRow Dtgvr = var.Clone() as DataGridViewRow;Dtgvr.DefaultCellStyle = var.DefaultCellStyle.Clone();for (int i = 0; i < var.Cells.Count; i++){Dtgvr.Cells[i].Value = var.Cells[i].Value;}if (var.Index % 2 == 0)Dtgvr.DefaultCellStyle.BackColor = ResultDGV.RowsDefaultCellStyle.BackColor;ResultDGV.Rows.Add(Dtgvr);}return ResultDGV;}catch (Exception ex){MessageBox.Show(ex.Message);}return null;
}

现在就没有遗憾了.

转载于:https://www.cnblogs.com/luckeryin/archive/2009/09/16/1567955.html

C#中完美克隆引用类型的对象相关推荐

  1. java中四种引用类型(对象的强、软、弱和虚引用)

    2019独角兽企业重金招聘Python工程师标准>>> 对象的强.软.弱和虚引用在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有 ...

  2. js实现对象完美克隆

    我们知道,在js中,当object作为参数传递到函数中进行处理后,实际上是修改了传入的对象本身(或者说是对象的引用),但很多时候我们并不希望函数去修改我们的这些对象参数,这就需要使用到对象的克隆,我们 ...

  3. [No0000B5]C# 类型基础 值类型和引用类型 及其 对象判等 深入研究1

    引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复 ...

  4. java中clone方法_Java Object clone()方法– Java中的克隆

    java中clone方法 Cloning is the process of creating a copy of an Object. Java Object class comes with na ...

  5. java 克隆_Java实现对象克隆的方法

    前言 这也是昨天的面试题. 当时只说了深拷贝以及浅拷贝,面试官问了两遍还有吗,我很肯定的说就这两种了,面试结束之后查了一下,啪啪打脸. 正文 JAVA实现克隆有两种形式 浅克隆 深克隆 浅克隆与深克隆 ...

  6. Java中的垃圾回收与对象生命周期

    转载自   Java中的垃圾回收与对象生命周期 1. 垃圾回收 垃圾回收是Java程序设计中内存管理的核心概念,JVM的内存管理机制被称为垃圾回收机制. 一个对象创建后被放置在JVM的堆内存中,当永远 ...

  7. Java中如何克隆集合——ArrayList和HashSet深拷贝

    2019独角兽企业重金招聘Python工程师标准>>> 编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法 ...

  8. figma下载_如何在Figma中创建逼真的3D对象

    figma下载 by Gbolahan Taoheed Fawale 通过Gbolahan Taoheed Fawale 如何在Figma中创建逼真的3D对象 (How to create reali ...

  9. 编写程序,使用一维数组,模拟栈数据结构。 要求: 1、这个栈可以存储java中的任何引用类型的数据。 2、在栈中提供push方法模拟压栈。(栈满了,要有

    代码 /*第一题:编写程序,使用一维数组,模拟栈数据结构.要求:1.这个栈可以存储java中的任何引用类型的数据.2.在栈中提供push方法模拟压栈.(栈满了,要有提示信息.)3.在栈中提供pop方法 ...

最新文章

  1. 最终版本Science级组合图表绘制
  2. 用再生龙Clonezilla 来克隆Linux
  3. 大前端晋级系列之-策略模式
  4. Django创建项目
  5. jboss fuse 教程_IDC关于使用JBoss Fuse的商业价值的报告(与Apache Camel一起使用)
  6. PID控制器开发笔记之八:带死区的PID控制器的实现
  7. 如何把备份的bak还原到新的数据库
  8. java jws-_为JWS应用程序启动指定JRE位置
  9. 开发转测试没人要_iOS13beta8发布,微信再次测试新功能
  10. 该网站可能含有恶意软件,有可能会危害您的电脑 清除办法
  11. SuperMap iDesktopX _ 高德POI数据下载
  12. spark python编程 林子雨_林子雨编著《Spark编程基础(Python版)》教材第5章的命令行和代码...
  13. 实时错误‘429’:ActiveX控件不能创建对象
  14. 服务器上可以监控虚拟机操作吗,使用Vmware免费虚拟机监控程序的利弊
  15. css淡入动画,使用CSS淡入大动画效果
  16. kafka auto.offset.reset值失效 earliest/latest详解
  17. python迅雷下载任务出错_迅雷下载时提示“任务出错”怎么办?(附多种解决方法)...
  18. 键盘按键错乱,鼠标也失灵怎么办。。。。。
  19. 什么?朋友圈出现了叠中叠?教你三招轻松应对朋友圈折叠
  20. 大数据技术原理与应用(第十章 Spark)

热门文章

  1. ssh无密码登录_3个简单步骤即可完成无密码SSH登录
  2. SQL创建数据库– PostgreSQL,MySQL,SQL Server
  3. Spring Boot –无法确定数据库类型NONE的嵌入式数据库驱动程序类
  4. 文件和目录(二)--unix环境高级编程读书笔记
  5. 不同级别的Java开发人员的应聘要求
  6. C++算法工程师需要具备开发能力
  7. .net mvc 导出excel表格
  8. tomcat使用线程池配置高并发连接
  9. 创业记-我的技术选型
  10. Django学习系列之ModelForm