1. 手工克隆

一个能够保证对象完全按照你所想的那样进行克隆的方式是手工克隆对象的每一个域(field)。这种方式的缺点是麻烦而且容易出错:如果你在类中增 加了一个域,你很可能会忘记更新Clone方法,而且一直要克隆到值类型。例如下面的代码中,克隆Zoo对象,由于Zoo对象中的ZAnimal属性是引用类型,所以需要继续克隆ZAnimal。

[Serializable]

public class Animal:ICloneable

{

private string animalName;

public string AnimalName

{

get { return this.animalName; }

set { this.animalName = value; }

}

public Animal(string name)

{

animalName = name;

}

public Animal() { }

public object Clone()

{

Animal newAnimal = new Animal();

newAnimal.AnimalName = this.AnimalName;

return newAnimal;

}

}

[Serializable]

public class Zoo:ICloneable

{

private string zoonName;

private Animal animal;

public string ZooName

{

get { return this.zoonName; }

set { this.zoonName = value; }

}

public Animal ZAnimal

{

get { return this.animal; }

set { this.animal = value; }

}

public Zoo() { }

public Zoo(string name, Animal animal)

{

this.ZooName = name;

this.ZAnimal = animal;

}

//逐个复制field克隆方法

public object Clone()

{

Zoo newZoo = new Zoo();

newZoo.ZAnimal = this.ZAnimal.Clone() as Animal;

newZoo.ZooName = this.ZooName;

return newZoo;

}

}

2.序列化方式克隆

克隆一个对象的最简单的方法是将它序列化并立刻反序列化为一个新对象。该种方式必须克隆的对象必须是可序列化的。所以需要在Animal类和Zoo类上声明是可序列化,方法是在类上面加上[Serializable]

将上面的克隆方法改为:

public object Clone()

{

BinaryFormatter bf = new BinaryFormatter();

MemoryStream ms = new MemoryStream();

bf.Serialize(ms,this);

ms.Seek(0, SeekOrigin.Begin);

return bf.Deserialize(ms);

}

转载于:https://www.cnblogs.com/LouisZhu/archive/2010/06/02/1750347.html

C#中的深克隆的两种方式相关推荐

  1. 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...

  2. Java中HashMap遍历的两种方式

    第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...

  3. 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    实验4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 姓名:李冬辉 学号:20133201 注: 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http ...

  4. sh执行文件 参数传递_详解shell中脚本参数传递的两种方式

    方式一:$0,$1,$2.. 采用$0,$1,$2..等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用${ ...

  5. java 深克隆_Java实现深克隆的两种方式

    序列化和依次克隆各个可变的引用类型都可以实现深克隆,但是序列化的效率并不理想 下面是两种实现深克隆的实例,并且测试类对两种方法进行了对比: 1.重写clone方法使用父类中的clone()方法实现深克 ...

  6. WCF中的ServiceHost初始化两种方式

    在宿主程序中初始化ServiceHost有直接写代码和使用配置文件两种方式.使用ServiceHost首先要引用System.ServiceModel 命名空间. 1 代码方式 using(Servi ...

  7. Java并发基础01. 传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  8. Java中实现多线程的两种方式之间的区别

    Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...

  9. WCF中的ServiceHost初始化两种方式(宿主)

    在宿主程序中初始化ServiceHost有直接写代码和使用配置文件两种方式.使用ServiceHost首先要引用System.ServiceModel 命名空间. 1 代码方式 using(Servi ...

最新文章

  1. android relativelayout 点击事件,Android Relativelayout点击背景行为
  2. 清华自动驾驶前沿报告!解密六大关键技术,全球人才分布【附下载】| 智东西内参...
  3. 简单解决XP共享连接数10限制
  4. Nand分区及nand erase简解
  5. IBASE archive pre-processing report RIBARCHV
  6. 第六次会议(4.15)
  7. PyCharm2019.1.1安装(Win10)
  8. 【Spark】Spark 2.4 Stream 读取kafka 写入kafka
  9. php登录 cookie,使用cookie进行简单的PHP登录
  10. python turtle画彩虹简单_Python基础实例——绘制彩虹(turtle库的应用)
  11. 【iVX从入门到精通 · 开篇】初始iVX——零代码的可视化编程语言
  12. 啊哈C语言第四章 第九节
  13. 本特利330505-02-02-02-00速度传感器
  14. 职场干货 | 如何让你的自我介绍,快速打动面试官
  15. 8月第3周基金排行榜 | TokenInsight
  16. Static Asynchronous Component Misuse Detection for Android Applications
  17. 跨平台应用开发进阶(三十四) :uni-app 应用 Universal Link 实现 iOS 微信分享
  18. Excel如何隔行插入图片?
  19. php跳转到qq界面,PHP实现QQ登录的开原理和实现过程
  20. 高通快速调试命令集合---持续更新

热门文章

  1. php处理微信返回xml数据,php将微信返回的xml格式转换成数组
  2. postgresql 参数替换 游标_postgresql动态游标使用案例
  3. python安装没有pip选项_python-3.x – 在ubuntu上没有pip的python安装
  4. c语言程序窗口后台持续监测,用c语言实现后台运行的、每隔30s检查一次的、带有日志功能的断网重新连接程序...
  5. vba字典合并单元格为空_VBA合并单元格求和处理套路
  6. dapper封装_用了Dapper之后通篇还是SqlConnection,真的看不下去了
  7. python脚本忽略MySQLdb的warnings
  8. 关于js选项卡的一些问题
  9. 【深度学习】神经网络结构搜索(NAS)与多模态
  10. 洛谷题单的Python版题解(有需要的小伙伴可以来看看哦~!)