c# 关于浅拷贝和深拷贝
class Program
{
static void Main(string[] args)
{
//浅拷贝
Person p1 = new Person();
p1.Name = "张三";
p1.Mycar = new Car() { Brand = "奥迪A6" }; Person p2 = new Person();
p2.Name = p1.Name;
p2.Mycar = p1.Mycar; //p1.Mycar 和 p2.Mycar 指向同一个内存地址 Console.WriteLine("p1.Mycar:" + p1.Mycar.Brand);
Console.WriteLine("p2.Mycar:" + p2.Mycar.Brand);
//p1.Mycar:奥迪A6
//p2.Mycar:奥迪A6 p1.Mycar.Brand = "奔驰";
Console.WriteLine("p1.Mycar:" + p1.Mycar.Brand);
Console.WriteLine("p2.Mycar:" + p2.Mycar.Brand);
//p1.Mycar:奔驰
//p2.Mycar:奔驰 //深拷贝
Person p3 = new Person();
p3.Name = "张三";
p3.Mycar = new Car() { Brand = "奥迪A6" }; Person p4 = new Person();
p4.Name = p3.Name;
p4.Mycar = new Car() { Brand = p3.Mycar.Brand }; //这里重新创建了Car对象,p3.Mycar 和 p4.Mycar 指向两个不同内存地址 Console.WriteLine("p3.Mycar:" + p3.Mycar.Brand);
Console.WriteLine("p4.Mycar:" + p4.Mycar.Brand);
//p1.Mycar:奥迪A6
//p2.Mycar:奥迪A6 p3.Mycar.Brand = "奔驰";
Console.WriteLine("p3.Mycar:" + p3.Mycar.Brand);
Console.WriteLine("p4.Mycar:" + p4.Mycar.Brand);
//p1.Mycar:奔驰
//p2.Mycar:奥迪A6 //总结:
//浅拷贝是共用一个内存地址,当p1改变p2也随着改变。
//深拷贝是完全重新创建了一个新的对象,当p1改变不会对p2任何影响。 //浅拷贝2
Person p5 = p1.QianCopy(); //深拷贝2
Person p6 = p1.ShenCopy(); Console.ReadKey();
}
} [Serializable] //添加特性,标记为可序列化。
public class Person
{
public string Name { get; set; }
public Car Mycar { get; set; } //浅拷贝--通过父类object内部方法MemberwiseClone实现
public Person QianCopy()
{
return (Person)this.MemberwiseClone();
}
//深拷贝--通过二进制序列化
public Person ShenCopy()
{
//System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, this); //序列化
ms.Position = ; //注意一点,流的当前位置要回到开头位置
return (Person)bf.Deserialize(ms); //反序列化
}
} [Serializable]
public class Car
{
public string Brand { get; set; }
}
c# 关于浅拷贝和深拷贝的更多相关文章
- [转] js对象浅拷贝和深拷贝详解
本文为大家分享了JavaScript对象的浅拷贝和深拷贝代码,供大家参考,具体内容如下 1.浅拷贝 拷贝就是把父对像的属性,全部拷贝给子对象. 下面这个函数,就是在做拷贝: var Chinese = ...
- 【转】Python中的赋值、浅拷贝、深拷贝介绍
这篇文章主要介绍了Python中的赋值.浅拷贝.深拷贝介绍,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式,需要的朋友可以参考下 和很多语言一样,Python中 ...
- 渐析java的浅拷贝和深拷贝
首先来看看浅拷贝和深拷贝的定义: 浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝. 深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所 ...
- 关于JavaScript的浅拷贝和深拷贝
在 JS 中有一些基本类型像是Number.String.Boolean,而对象就是像这样的东西{ name: 'Larry', skill: 'Node.js' },对象跟基本类型最大的不同就在于他 ...
- c#中浅拷贝和深拷贝的理解
c#中拷贝有浅拷贝和深拷贝之分. 例如对象A,其中有值类型字段和引用类型字段: 1.浅拷贝: 对于值类型字段,直接逐位复制到新拷贝的副本对象中,修改副本的字段的值,不会影响源对象中字段的值: 对于引用 ...
- C#浅拷贝与深拷贝区别
也许会有人这样解释C# 中浅拷贝与深拷贝区别: 浅拷贝是对引用类型拷贝地址,对值类型直接进行拷贝. 不能说它完全错误,但至少还不够严谨.比如:string 类型咋说? 其实,我们可以通过实践来寻找答案 ...
- IOS的浅拷贝和深拷贝
什么是深拷贝和浅拷贝 浅拷贝:就是指针的复制,拷贝的指针跟原指针指向内存中的同一个位置的对象.至于对象的引用计数值是否+1,就是看拷贝的指针赋给给的变量是Strong类型的,还是week类型的. 如果 ...
- 关于python中赋值、浅拷贝、深拷贝之间区别的深入分析
当重新学习了计算机基础课程<数据结构和算法分析>后再来看这篇自己以前写的博文,发现错误百出.python内置数据类型之所以会有这些特性,归根结底是它采用的是传递内存地址的方式,而不是传递真 ...
- js中的浅拷贝和深拷贝
说说最近所学:浅拷贝和深拷贝也叫做浅克隆和深克隆,深浅主要针对的是对象的"深度",常见的对象都是"浅"的,也就是对象里的属性就是单个的属性,而"深&q ...
- 编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]
前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议13.为类型输出格式化字符串 建议14.正确实现浅拷贝和深 ...
随机推荐
- 嵌入式开发板iTOP4412学习开发板
网站:http://www.topeetboard.com 淘宝:https://item.taobao.com/item.htm?_u=okcahs0f42a&id=38712193806 ...
- socket通信入门
以一个基本的python程序为例解释 源代码如下: #!/usr/bin/env python #指出代码用什么程序去运行它.首先会到env设置里查找python的安装路径,再调用对应路径下的解释器 ...
- hdu 5800 To My Girlfriend + dp
传送门:hdu 5800 To My Girlfriend 题意:给定n个物品,其中i,j必选,l,m必不选,问组成体积为s的方法一共有多少种 思路:定义dp[i][j][s1][s2],表示前i种物 ...
- ZOJ 3820 Building Fire Stations 求中点+树的直径+BFS
题意:给一棵树,要求找出两个点,使得所有点到这两个点中距离与自己较近的一个点的距离的最大值(所有点的结果取最大的值,即最远距离)最小. 意思应该都能明白. 解法:考虑将这棵树摆直如下: 那么我们可以把 ...
- SSO - 我们为何需要单点登录系统
SSO,Single Sign On,也就是单点登录,保证一个账户在多个系统上实现单一用户的登录 现在随着网站的壮大,很多服务会进行拆分,会做SOA服务,会使用dubbo做微服务,或者简单的小型分布式 ...
- Unity 2D Skeletal Animation
本文记录在Unity中制作2D 骨骼动画的笔记 Unity版本:4.3 Uni2D 使用骨骼动画前,把Sprite Mesh 的Type 改为 Grid ,设置合适的骨骼数量和分配权重 1.选中创建好 ...
- C# 程序性能提升篇-1、装箱和拆箱,枚举的ToString浅析
前景提要: 编写程序时,也许你不经意间,就不知不觉的使程序代码,发生了装箱和拆箱,从而降低了效率,不要说就发生那么一次两次,如果说是程序中发生了循环.网络程序(不断请求处理的)等这些时候,减少装箱和拆 ...
- MString 与 QString 互转
MQtUtil static MString toMString (const QString &qstr) Convenience utility to convert a QStri ...
- HTML5-WebSocket技术学习(2)
上一篇介绍了websocket的基本用法.这篇介绍websocket的一个框架: socket.io socket.io是一个既可以用在客户端又可以用在服务器端的框架. 本篇介绍socket.io在客 ...
- Gerrit日常操作命令收集
Gerrit代码审核工具是个好东西,尤其是在和Gitlab和Jenkins对接后,在代码控制方面有着无与伦比的优势. 在公司线上部署了一套Gerrit系统,在日常运维中,使用了很多gerrit命令,在 ...