引用类型的赋值、浅拷贝和深拷贝的区别
来源:互联网 发布:窃听噐在淘宝叫什么 编辑:程序博客网 时间:2024/06/05 16:15
ICloneable 接口:支持克隆,即用与现有实例相同的值创建类的新实例。
MemberwiseClone 方法:创建当前 System.Object 的浅表副本。
浅拷贝:给对象拷贝一份新的对象。
浅拷贝的定义 —— 只对值类型(或string)类型分配新的内存地址。
深拷贝:给对象拷贝一份全新的对象。
深拷贝的定义 —— 对值类型分配新的内存地址,引用类型、以及引用类型的内部字段分配的新的地址。
注意:
1、在 .NET 程序中,应该避免使用 ICloneable 接口。
因为通过该接口无法判断究竟是浅拷贝还是深拷贝,这会造成误解或误用。
2、深拷贝应该复制该对象本身及通过该对象所能到达的完整的对象图,浅拷贝只复制对象本身(就是该对象所表示的在堆中的一块连续地址中的内容)。
[Serializable] public class Person : ICloneable { public int Age { get; set; } public string Address { get; set; } public Name Name { get; set; } /* public object Clone() //浅拷贝 { return this.MemberwiseClone(); } */ public object Clone() //深度拷贝 { using (MemoryStream ms = new MemoryStream(1000)) { object CloneObject; BinaryFormatter bf = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone)); bf.Serialize(ms, this); ms.Seek(0, SeekOrigin.Begin); // 反序列化至另一个对象(即创建了一个原对象的深表副本) CloneObject = bf.Deserialize(ms); // 关闭流 ms.Close(); return CloneObject; } } } [Serializable] public class Name { public Name(string frisName, string lastName) { FristName = frisName; LastName = lastName; } public string FristName { get; set; } public string LastName { get; set; } }
0 0
- 引用类型的赋值、浅拷贝和深拷贝的区别
- 引用类型的赋值、浅拷贝和深拷贝的区别
- Python中的赋值,浅拷贝和深拷贝的区别
- python 赋值的时候是引用,如果需要复制则需要注意深拷贝和浅拷贝的区别
- 拷贝和赋值的区别
- Python FAQ2:赋值、浅拷贝、深拷贝的区别?
- Python 赋值、浅拷贝、深拷贝的区别?
- Python赋值、浅拷贝与深拷贝之间的区别
- Python中赋值、浅拷贝、深拷贝的区别
- Python 赋值、浅拷贝、深拷贝的区别?
- Python 赋值、浅拷贝、深拷贝的区别?
- 深拷贝和浅拷贝的区别
- 浅拷贝和深拷贝的区别
- 深拷贝和浅拷贝的区别
- 深拷贝和浅拷贝的区别
- 深拷贝和浅拷贝的区别
- 深拷贝和浅拷贝的区别
- 浅拷贝和深拷贝的区别?
- POJ 1204 Word Puzzles - dic_tree + DFS
- LED明装筒灯厂家直销,明装LED筒灯第一品牌
- waf编译浅学
- poj2485Highways——————【 Prim 】
- 用ajax实现预览链接
- 引用类型的赋值、浅拷贝和深拷贝的区别
- hdoj.1050 Moving Tables 20140811
- hdu1213 - How Many Tables (基础并查集)
- 解决sliverlight,非button控件保存,光标未移开,binding的值不提交问题
- JQ tab 切换-局部刷新(关于index)
- 如何评估一个类是否是高质量的?
- REST介绍
- 关于typedef的用法总结
- hdu2819 Swap