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# 关于浅拷贝和深拷贝的更多相关文章

  1. [转] js对象浅拷贝和深拷贝详解

    本文为大家分享了JavaScript对象的浅拷贝和深拷贝代码,供大家参考,具体内容如下 1.浅拷贝 拷贝就是把父对像的属性,全部拷贝给子对象. 下面这个函数,就是在做拷贝: var Chinese = ...

  2. 【转】Python中的赋值、浅拷贝、深拷贝介绍

    这篇文章主要介绍了Python中的赋值.浅拷贝.深拷贝介绍,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式,需要的朋友可以参考下   和很多语言一样,Python中 ...

  3. 渐析java的浅拷贝和深拷贝

          首先来看看浅拷贝和深拷贝的定义:       浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝.       深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所 ...

  4. 关于JavaScript的浅拷贝和深拷贝

    在 JS 中有一些基本类型像是Number.String.Boolean,而对象就是像这样的东西{ name: 'Larry', skill: 'Node.js' },对象跟基本类型最大的不同就在于他 ...

  5. c#中浅拷贝和深拷贝的理解

    c#中拷贝有浅拷贝和深拷贝之分. 例如对象A,其中有值类型字段和引用类型字段: 1.浅拷贝: 对于值类型字段,直接逐位复制到新拷贝的副本对象中,修改副本的字段的值,不会影响源对象中字段的值: 对于引用 ...

  6. C#浅拷贝与深拷贝区别

    也许会有人这样解释C# 中浅拷贝与深拷贝区别: 浅拷贝是对引用类型拷贝地址,对值类型直接进行拷贝. 不能说它完全错误,但至少还不够严谨.比如:string 类型咋说? 其实,我们可以通过实践来寻找答案 ...

  7. IOS的浅拷贝和深拷贝

    什么是深拷贝和浅拷贝 浅拷贝:就是指针的复制,拷贝的指针跟原指针指向内存中的同一个位置的对象.至于对象的引用计数值是否+1,就是看拷贝的指针赋给给的变量是Strong类型的,还是week类型的. 如果 ...

  8. 关于python中赋值、浅拷贝、深拷贝之间区别的深入分析

    当重新学习了计算机基础课程<数据结构和算法分析>后再来看这篇自己以前写的博文,发现错误百出.python内置数据类型之所以会有这些特性,归根结底是它采用的是传递内存地址的方式,而不是传递真 ...

  9. js中的浅拷贝和深拷贝

    说说最近所学:浅拷贝和深拷贝也叫做浅克隆和深克隆,深浅主要针对的是对象的"深度",常见的对象都是"浅"的,也就是对象里的属性就是单个的属性,而"深&q ...

  10. 编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]

    前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议13.为类型输出格式化字符串 建议14.正确实现浅拷贝和深 ...

随机推荐

  1. Android中的Shape使用总结

    参考:http://www.cnblogs.com/gzggyy/archive/2013/05/17/3083218.html 在Android程序开发中,我们经常会去用到Shape这个东西去定义各 ...

  2. memcpy函数

    实现1:<高质量c++,c编程指南> void *mymemcpy(void *dst,const void *src,size_t num) { assert((dst!=NULL)&a ...

  3. SQL SERVER 2012 使用订阅发布同步数据库

    软件做大了,客户就多了,一个数据库服务器是远远不够的,当有一台数据服务器卦掉,那整个系统就会崩溃,所以必须考虑到数据库的自动同步与备份,当一台数据库服务 器宕机,自然就有用一台数据服务器启动起来保证整 ...

  4. iTOP-4412开发板低功耗高性能的开源硬件平台——上手评测

    iTOP-4412开发板现在比较热门的开发板,笔者近期入了一套.也推荐给初学ARM的朋友学习,4412开发板搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,兼具快速读取与超 ...

  5. hdu1042 N!

    /* N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Subm ...

  6. shell script 学习笔记-----if,for,while,case语句

    1.if内的判断条件为逻辑运算: 2.if内的判断条件为目录是否存在,文件是否存在,下图先检验目录/home/monster是否存在,然后再检测/home/monster中的file.txt文件是否存 ...

  7. 华为访问列表traffic-policy案例

    1,最近某公司有个需求 2,配置为重点--在于思路 需求:192.168.1 3 5 8网段不能访问2.x网段 仅允许财务2.x访问1.253打印机. acl name permit_printer ...

  8. Linux 进程与线程四(加锁--解锁)

    线程共享进程的内存空间,打开的文件描述符,全局变量. 当有多个线程同事访问一块内存空间或者一个变量.一个文件描述符,如果不加控制,那么可能会出现意想不到的结果. 原子操作 对于我们的高级语言(C语言, ...

  9. Log4net Dll用法

    在导入Log4net的过程中,遇到一两个小bug. 开发平台必须是NET4 而不能是net4 client profile Log4Helper 里面的Namespace要和我们建立项目的名称一致. ...

  10. BibTex参考文献制作

    &1 制作ref.bib文件 在必应学术或者谷歌学术中搜索文章,这里以我硕士的老板和师兄的一篇文章为例: 两种搜索引擎几乎都差不多,一丢丢区别在下面会讲,点击上图中被引数的旁边那个“引用”按钮 ...