浅谈C#浅拷贝和深拷贝
近来爱上一本书《编写高质量代码,改善C#程序的157个建议》,我想很多人都想编写高质量的代码,因为我们不仅仅是码农,更是一名程序员。
从今天开始,我将每天和大家分享这本书中的内容,并加上自己的理解,希望可以帮助到更多和我一样盲目的程序员们。
今天我们谈谈C#中的对象拷贝问题;
所谓的对象拷贝,其实就是为对象创建副本,C#中将拷贝分为两种,分别为浅拷贝和深拷贝;
所谓浅拷贝就是将对象中的所有字段复制到新的副本对象中;浅拷贝对于值类型与引用类型的方式有区别,值类型字段的值被复制到副本中后,在副本中的修改不会影响源对象对应的值;然而对于引用类型的字段被复制到副本中的却是引用类型的引用,而不是引用的对象,在副本中对引用类型的字段值被修改后,源对象的值也将被修改。
深拷贝也同样是将对象中的所有字段复制到副本对象中,但是,无论对象的值类型字段或者引用类型字段,都会被重新创建并复制,对于副本的修改,不会影响到源对象的本身;
当然,无论是哪种拷贝,微软都建议使用类型继承ICloneable接口的方式明确告诉调用者,该对象是否可用被拷贝。当然了,ICloneable接口只提供了一个声明为Clone的方法,我们可以根据需求在Clone的方法内实现浅拷贝或者是深拷贝,下面我们进行一段浅拷贝的案例,代码如下
class Student : ICloneable
{
public string IDCode { get; set; } public int Age { get; set; } public Grent Grent { get; set; } #region 拷贝主体
public object Clone()
{
return this.MemberwiseClone();
//throw new NotImplementedException();
}
#endregion } class Grent
{
public string Name { get; set; } public override string ToString()
{
return this.Name;
}
}
调用
Student stu1 = new Student()
{
IDCode = "lily",
Age = ,
Grent = new Grent() { Name="五年三班"}
};
Student stu2 = stu1.Clone() as Student;
if (stu2 == null) {
Console.WriteLine("转换失败");
Console.ReadKey();
return;
} Console.WriteLine(stu2.IDCode);
Console.WriteLine(stu2.Age);
Console.WriteLine(stu2.Grent.ToString()); Console.WriteLine("重新为stu1赋值");
stu1.IDCode = "Anagle";
stu1.Age += ;
stu1.Grent.Name = "六年二班";
Console.WriteLine(stu2.IDCode);
Console.WriteLine(stu2.Age);
Console.WriteLine(stu2.Grent.ToString());
Console.ReadKey();
输出结果为:
lily
24
五年三班
重新为stu1赋值
lily
24
六年二班
aaarticlea/png;base64,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" alt="" />
这里我们需要注意一点Student中的IDCode属性是string类型,理论上string类型是引用类型,但是由于该引用类型的特殊性,Object.MemberwiseClone方法仍旧为他创建了副本,也就是说,在浅拷贝过程中,我们应该将字符串看成值类型;
因为Student中的Grent是引用类型,所以在stu1中的Grent的Name被改变的同时,副本stu2中的Grent的Name也同样被改变。
Student的深拷贝有多钟实现方法,最简单的方法是手动对字段诼个赋值,但是这种方法容易出错,也就是说,如果类型的字段发生变化或有增减时,那么该拷贝方法也就要发生相应的变化,所以,建议使用序列化的形式来进行深拷贝。实现代码如下
[Serializable]
class Student : ICloneable
{
public string IDCode { get; set; } public int Age { get; set; } public Grent Grent { get; set; } #region 拷贝主体
/// <summary>
/// 深度拷贝
/// </summary>
/// <returns></returns>
public Student DeepClone() {
using (Stream objectStream = new MemoryStream()) {
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(objectStream, this);
objectStream.Seek(,SeekOrigin.Begin);
return formatter.Deserialize(objectStream) as Student;
}
} public object Clone()
{
return this.MemberwiseClone();
}
#endregion }
调用DeepClone方法
Student stu1 = new Student()
{
IDCode = "lily",
Age = ,
Grent = new Grent() { Name="五年三班"}
};
Student stu2 = stu1.DeepClone() as Student;
if (stu2 == null) {
Console.WriteLine("转换失败");
Console.ReadKey();
return;
} Console.WriteLine(stu2.IDCode);
Console.WriteLine(stu2.Age);
Console.WriteLine(stu2.Grent.ToString()); Console.WriteLine("重新为stu1赋值");
stu1.IDCode = "Anagle";
stu1.Age += ;
stu1.Grent.Name = "六年二班";
Console.WriteLine(stu2.IDCode);
Console.WriteLine(stu2.Age);
Console.WriteLine(stu2.Grent.ToString());
Console.ReadKey();
输出结果为:
lily
24
五年三班
重新为stu1赋值
lily
24
五年三班
aaarticlea/png;base64,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" alt="" />
这次我们看到的结果已经很明显了,深拷贝后,源对象的重新赋值与修改将不再导致副本对象被修改,这样将很好的控制住引用类型的拷贝问题。
浅谈C#浅拷贝和深拷贝的更多相关文章
- 浅谈java浅拷贝和深拷贝
前言:深拷贝和浅拷贝的区别是什么? 浅拷贝:被复制的对象的所有变量都含有原来对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之, 浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.深拷 ...
- 浅谈Javascript 浅拷贝和深拷贝的理解
javascript中存储对象都是存地址的. 浅拷贝:浅拷贝是都指向同一块内存区块,浅拷贝共用同一内存地址,你改值我也变.如果拷贝的对象里面的值是一个对象或者数组,它就是浅拷贝,拷贝的知识引用地址. ...
- 浅谈Java中的深拷贝和浅拷贝(转载)
浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...
- 浅谈Java中的深拷贝和浅拷贝
转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...
- 浅谈python 复制(深拷贝,浅拷贝)
博客参考:点击这里 python中对象的复制以及浅拷贝,深拷贝是存在差异的,这儿我们主要以可变变量来演示,不可变变量则不存在赋值/拷贝上的问题(下文会有解释),具体差异如下文所示 1.赋值: a=[1 ...
- 浅谈C#中的深拷贝(DeepCopy)与浅拷贝(MemberwiseClone)
场景:MVVM模式中数据双向绑定,想实现编辑.保存.撤销操作时也双向绑定了,不能实现撤销操作. 后来通过搜索找到了继承IEditableObject接口实现撤销操作,但是对其中使用了Memberwis ...
- 浅谈.net平台下深拷贝和浅拷贝
在.net类库中,对象克隆广泛存在于各种类型的实现中,凡是实现了ICloneable接口的类型都具备克隆其对象实例的能力.所以本文讲述的深拷贝和浅拷贝也是在实现ICloneable接口的基础上进行的 ...
- java基础(十七)----- 浅谈Java中的深拷贝和浅拷贝 —— 面试必问
假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...
- 浅谈JS中的浅拷贝与深拷贝
前端工程师应该都比较熟悉浅拷贝和深拷贝的概念,在日常业务代码的过程中,特别是做数据处理的时候,经常行的会遇到,比如如何在不修改原对象的基础上,重新生成一个一模一样的对象,加以利用,又或是,如何巧妙地运 ...
随机推荐
- AA投资
AA投资创建于2015年,总部位于北京,创始人成妙绮和王浩泽,专注于天使轮的技术创新驱动的TMT项目投资. 投资方向 AA投资是一家2015年才成立的风险投资机构,专注于种子轮.天使轮.Pre-A轮的 ...
- iOS开发-网易滚动导航栏
HACursor,是一个对横向ScrollView中的视图进行管理的UI控件.只要几行代码就可以集成类似于网易新闻对主题页面进行排序,删除操作的功能.主srollview参考iOS原生的UITable ...
- LoadRunner8 安装步骤
一.介绍 LoadRunner,是一种预测系统行为和性能的负载测试工具.通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试.企业使用L ...
- Java-马士兵设计模式学习笔记-观察者模式-读取properties文件改成单例模式
一.概述 1.目标:读取properties文件改成单例模式 二.代码 1.Test.java class WakenUpEvent{ private long time; private Strin ...
- Struts2笔记——通配符和动态方法调用
通配符映射 * 一个 Web应用可能有成百上千个 action 声明. 可以利用 struts提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系 * 通配符映射规则 > 若 ...
- yii2 增加新的目录结构
搭建新的目录结构详细点击这里 搭建Restful API 点击这里 1.开发环境操作系统 Windows Server 2012 R2 DatacenterPHP架构 Ap ...
- iOS 安装使用cocoapods
一.什么是CocoaPods 1.为什么需要CocoaPods 在进行iOS开发的时候,总免不了使用第三方的开源库,比如SBJson.AFNetworking.Reachability等等.使用这些库 ...
- 使用RedisTemplate的操作类访问Redis(转)
深入理解Spring Redis的使用 (三).使用RedisTemplate的操作类访问Redis 事务需要开启enableTransactionSupport,然后使用@transactional ...
- Centos 7下安装Oracle 12c
SQL Server玩了有些年,最近想玩玩Oracle,于是想到装一台Oracle server来玩玩.第一次在Linux下安装Oracle,整个过程参考了一篇文章:http://blog.csdn. ...
- Linux系统中的load average
1. load average 定义 linux系统中的Load对当前CPU工作量的度量.简单的说是进程队列的长度. Load Average 就是一段时间 (1 分钟.5分钟.15分钟) 内平均 L ...