[Serializable]
public class Person:ICloneable
{
public string Name { get; set; }
public int Id { get; set; }
public int Age { get; set; }
public Department Department { get; set; } public object Clone()
{
return this.MemberwiseClone();
} public Person ShallowClone()
{
return Clone() as Person;
} public Person DeepClone()
{
using (Stream objStream = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(objStream, this);
objStream.Seek(, SeekOrigin.Begin);
return formatter.Deserialize(objStream) as Person;
}
}
} [Serializable]
public class Department
{
public string DeptName { get; set; }
public int DeptId { get; set; }
}

  class Program
{
static void Main(string[] args)
{
CloneDemo();
Console.ReadLine();
} static void CloneDemo()
{
Person fred = new Person()
{
Id = ,
Name = "Fred",
Age = ,
Department=new Department()
{
DeptId=,
DeptName="Dept1"
}
}; Console.WriteLine($"fred,name:{fred.Name},Id:{fred.Name},department name:{fred.Department.DeptName},deptid:{fred.Department.DeptId}"); Person shallowClonePerson = fred.ShallowClone() as Person;
Console.WriteLine($"shallowClonePerson,Name:{shallowClonePerson.Name},Id:{shallowClonePerson.Id},department name:{shallowClonePerson.Department.DeptName},deptId:{shallowClonePerson.Department.DeptId}"); fred.Id = ;
fred.Name = "fred2";
fred.Age = ;
fred.Department.DeptId = ;
fred.Department.DeptName = "dept2";
Console.WriteLine($"shallowClonePerson,Name:{shallowClonePerson.Name},Id:{shallowClonePerson.Id},department name:{shallowClonePerson.Department.DeptName},deptId:{shallowClonePerson.Department.DeptId}"); Person deepClonePerson = fred.DeepClone() as Person;
Console.WriteLine($"deepClonePerson,Name:{deepClonePerson.Name},Id:{deepClonePerson.Id},department name:{deepClonePerson.Department.DeptName},id:{deepClonePerson.Department.DeptId}"); fred.Id = ;
fred.Name = "Fred3";
fred.Age = ;
fred.Department.DeptId = ;
fred.Department.DeptName = "dept3";
Console.WriteLine($"deepClonePerson,Name:{deepClonePerson.Name},Id:{deepClonePerson.Id},department name:{deepClonePerson.Department.DeptName},id:{deepClonePerson.Department.DeptId}");
}
}

C# ICloneable,shallow clone,deep clone.的更多相关文章

  1. 深拷贝(deep clone)与浅拷贝(shallow clone)

    深拷贝(deep clone)与浅拷贝(shallow clone) 浅复制(浅克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复 ...

  2. Java:浅克隆(shallow clone)与深克隆(deep clone)

    Summary 浅克隆与深克隆对于JavaSE来说,是个难度系数比较低的概念,但不应该轻视它. 假设一个场景:对于某个list,代码里并没有任何对其的直接操作,但里面的元素的属性却被改变了,这可能就涉 ...

  3. 深拷贝(deep clone)与浅拷贝(shallow clone)

    一.浅复制和深复制概念 浅复制(浅克隆): 被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不是复制它所引用的对象. 深 ...

  4. Ruby中如何复制对象 (deep clone)(转载)

    Ruby中如何复制对象 (deep clone) 用Ruby复制一个对象(object)也许没有你想像的那么容易. 今天我google了半天, 做个总结吧. 先从最简单的开始, b = a 是复制吗? ...

  5. Deep Clone 常用方式总结

    Deep Clone Example 总结 Deep Clone 一般有如下几种实现方式: 纯手工每个类实现赋值 (ps: 不做介绍,一般都不想这么玩) 序列化和反序列化 纯反射 emit 或 Exp ...

  6. JavaScript 中的对象深度复制(Object Deep Clone)

    JavaScript中并没有直接提供对象复制(Object Clone)的方法. JavaScript中的赋值,其实并不是复制对象,而是类似`c/c++`中的引用(或指针),因此下面的代码中改变对象b ...

  7. What is the most efficient way to deep clone an object in JavaScript?

    What is the most efficient way to deep clone an object in JavaScript? Reliable cloning using a libra ...

  8. 对C#对象的Shallow、Deep Cloning认识【转】

    好像园内比较多博客对 Shallow.Deep Cloning的翻译是深拷贝.浅拷贝,当时我懵了,这个叫法怎么怪怪的. 就好像看军情观察室,台湾评论员,导弹叫飞弹. 至于它们的区别,一张图就可以解释. ...

  9. jQuery中clone和clone(true)的区别

    今天要写的是clone和clone(true)的区别 两者长得很像呀,clone(true)比clone()  多了一个true.看下图白白的牙,笑起来就是这么灿烂.有了true就跟笑起来一样,有了笑 ...

随机推荐

  1. Logstash filter 插件之 date

    使用 date 插件解析字段中的日期,然后使用该日期或时间戳作为事件的 logstash 时间戳.对于排序事件和导入旧数据,日期过滤器尤其重要.如果您在事件中没有得到正确的日期,那么稍后搜索它们可能会 ...

  2. java高并发系列【共34篇,强力建议观看】

    第1天:必须知道的几个概念 第2天:并发级别 第3天:有关并行的两个重要定律 第4天:JMM相关的一些概念 第5天:深入理解进程和线程 第6天:线程的基本操作 第7天:volatile与Java内存模 ...

  3. (四十三)c#Winform自定义控件-Listview-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  4. Winform中使用DevExpress的CheckEdit控件实现多选条件搜索

    场景 Winform控件-DevExpress18下载安装注册以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...

  5. FCC---Create a Graphic Using CSS---新月图形

    By manipulating different selectors and properties, you can make interesting shapes. One of the easi ...

  6. element-ui组件中的input等的change事件中传递自定义参数

    以select为例,如果select写在循环里,触发change事件时可能不只需要传递被选中项的值,还要传递index过去,来改变同一循环中的其他标签的状态. 下面这样写是无效的: @change=& ...

  7. tableView代理方法执行顺序

    tableView代理方法执行顺序,随着iOS系统版本的不断升级,执行顺序也有所变化 1.iOS7.1中先依次调一遍heightForRow方法再依次调一遍cellForRow方法,在调cellFor ...

  8. Android进阶之绘制-自定义View完全掌握(二)

    这是自定义View系列的第二篇博客,我们继续来学习关于自定义View的知识. 今天我们来实现一下广告条案例. 我们要实现的是这样的一个效果. 要想实现这样的效果,我们可以借助ViewPager控件,然 ...

  9. Linux日志中出现大量dhclient mesage浅析

    最近检查发现一台Linux服务器,发现其日志里面有大量下面信息,其中部分信息做了脱敏处理.其中一个地址A(192.168.AAA.AAA) 为DNS服务器地址,地址B(192.168.BBB.BBB) ...

  10. 面向对象~~类的成员: 私有成员,公有成员, 实例方法, 类方法, 静态方法, 属性(property), isinstance ,issubclass, 元类(type)

    一 私有成员公有成员 公有成员: 在任何地方都能访问 私有成员: 只有在类的内部才能访问 类从加载时,只要遇到类中的私有成员,都会在私有成员前面加上_类名 二 实例方法 实例方法就是类的实例能够使用的 ...