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. mysql中count(),group by使用

    count()统计表中或数组中记录 count(*)返回检索行的数目,且不论其值中是否包含NULL count(column_name)返回的是对列中column_name不为NULL的行的统计 例如 ...

  2. Lua面向对象编程

    Lua中的table就是一种对象,看以下一段简单的代码: , b = } , b = } local tb3 = tb1 if tb1 == tb2 then print("tb1 == t ...

  3. VMware Workstation不可恢复的错误:(vmui)

    虚拟机中部署项目,由于项目的日志是gbk的,就把虚拟机中linux编码改成gbk了,结果问题来了,日志显示中文正常了,但是虚拟机运行一下就出错了,注意虚拟机出错,并没导致linux也挂掉,只是linu ...

  4. hadooop2.6 job pending research

    https://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/ClusterSetup.html 我使用的是已经运行在 ...

  5. Linux NFS 介绍

    由SUN开发,用于在不同的系统之间使用,所以其设计与主机系统无关,用户想使用远程文件时,只需要mount –t nfs就可以把远程的文件拿到本地,像使用本地文件一样使用,非常方便. 它采用C/S架构, ...

  6. Hadoop 概述

    Hadoop 是 Apache 基金会下的一个开源分布式计算平台,以 HDFS 分布式文件系统 和 MapReduce 分布式计算框架为核心,为用户提供底层细节透明的分布式基础设施.目前,Hadoop ...

  7. [转]Cordova + Ionic in Visual Studio - 101 Tutorial [Part I]

    本文转自:http://binarylies.ghost.io/cordova-ionic-in-visual-studio/ Hi everyone, I thought about lending ...

  8. 转: 借助GitHub托管你的项目代码

    转自:http://www.cnblogs.com/edisonchou/p/5990875.html 备注: 原贴关于github使用说明,非常详细易懂.建议看原帖. 借助GitHub托管你的项目代 ...

  9. Android 可拖拽的GridView效果实现, 长按可拖拽和item实时交换

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17718579),请尊重他人的辛勤劳动成果,谢谢! 在And ...

  10. Android 界面排版的5种方式

    Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对 ...