C#中的深复制与浅复制
C#中分为值类型和引用类型,值类型的变量直接包含其数据,而引用类型的变量则存储对象的引用。
对于值类型,每个变量都有自己的数据副本,对一个变量的操作不可能影响到另一个变量。如
class Program
{
static void Main(string[] args)
{
int a = ;
int b=a;
a = ;
Console.WriteLine("a={0},b={1}",a,b);
Console.ReadKey(); }
}
输出为:
a=5,b=3
而对于引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能影响到另一个变量所引用的对象。
public class A
{
public int param;
public A(int i)
{
this.param = i;
}
} A a1 = new A();
A a2 = a1;
a1.param = ;
Console.WriteLine("a1.param={0},a2.param={1}",a1.param,a2.param);
Console.ReadKey();
输出为:
a1.param=10,a2.param=10
可见改变了a1中的param值,也会同样改变a2中的param值,因为它们指向的是同一个实例,其实就是同一个。
浅复制:实现浅复制需要使用Object类的MemberwiseClone方法创建一个浅表副本。
深复制:需实现ICloneable接口中的Clone方法,重新实例化一个对象作为返回值。
对于复制对象中的值类型,结果正确:
public class Person :ICloneable
{
private int age;
public int Age
{
get
{
return age;
}
set
{
this.age = value;
}
}
public Person(int i)
{
this.age = i;
}
public object Clone()
{ //return this.MemberwiseClone();
return new Person(this.age) as object;
}
} Person p1 = new Person();
Person p2 = (Person)p1.Clone();
p1.Age = ;
Console.WriteLine("p1.age={0},p2.age={1}",p1.Age,p2.Age);
Console.ReadKey();
利用 return this.MemberwiseClone()和return new Person(this.age) as object输出的值均为:
p1.age=10,p2.age=5
但是若是复制对象中的引用类型时,浅复制就会出现问题,如下:
public class Education
{
public int score; }
public class Person:ICloneable
{
public Education education=new Education ();
public Person(int i)
{
education.score = i;
}
public object Clone()
{ return this.MemberwiseClone();
//return new Person(this.education.score) as object;
}
}
Person p1 = new Person();
Person p2 = (Person)p1.Clone();
p1.education.score = ;
Console.WriteLine("p1.education.score={0},p2.education.score={1}", p1.education.score, p2.education.score);
Console.ReadKey();
当用return this.MemberwiseClone()时,即用浅复制时,输出为:
p1.education.score=99,p2.education.score=99
这与原来的代码意图不符,当用return new Person(this.education.score) as object时,输出为
p1.education.score=99,p2.education.score=59
C#中的深复制与浅复制的更多相关文章
- Java中对象的深复制和浅复制详解
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...
- Java中的深复制与浅复制
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. ...
- Java中的clone()----深复制,浅复制
这篇文章主要介绍了Java中对象的深复制(深克隆)和浅复制(浅克隆) ,需要的朋友可以参考下 1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他 ...
- js中的深复制与浅复制
前言 所谓深复制与浅复制(深拷贝与浅拷贝),乍一听感觉听高大上,像是一个非常难理解的概念,其实我们平常项目开发都是在用的,只是你可能不知道该怎么叫它的名字而已,就像你听熟了一首歌,就是不知道这首歌叫什 ...
- js中的深复制和浅复制
在实际情况中经常会遇到对对象复制的问题.比如在处理项目中的一笔多结构的数据存储或者调用,这个时候你就要对对象(json)进行操作,而不同的操作根据不同的需求来定义.其中最常见最普遍的是对对象的复制,重 ...
- .Net深复制、浅复制
在.Net,大家都知道引用类型的深复制.浅复制吧. ,一般int等值类型是值类型(复制时是直接传值),一般的类(List<T>,Class)是引用类型(复制时传地址),默认是浅复制.若ob ...
- C++学习基础七——深复制与浅复制
一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和char *str两个成员变量, 当深 ...
- iOS 集合的深复制与浅复制
概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制 ...
- C#深复制和浅复制
本文在于巩固基础 我们来看看什么是深复制.浅复制: C#中对于数据的复制机制虽然简单但是容易让人误解.C#数据类型大体分为值类型(value type)与引用类型(reference type).对于 ...
随机推荐
- Linux核心设计依据(七)系统调用
我理解的系统调用,用户进程和内核是内核提供了一个接口进行交互.除了异常和下降外.内核系统调用是唯一合法入境.像/proc还通过系统调用访问. 系统调用的意义: 让用户进程受限地訪问硬件设备 为用户空间 ...
- Linux在iptables教程基本应用防火墙
iptables它是Linux防火墙软件经常使用,下面说一下iptables设备.删除iptables规则.iptables只要打开指定的port.iptables屏蔽指定ip.ip科和解锁.删除添加 ...
- "错: void 值不被忽略,因为预期"解决
在C陷阱与缺陷,实现assert什么时候,在这个过程很聪明,化为一个表达式,在当条件为假时就会调用_assert_error报错并终止程序. 刚開始_assert_error 的返回值类型是 void ...
- CSS3新功能简要
1.CSS3 框架: 由 CSS3,您可以创建圆角.加入到该矩形阴影,使用图片绘制边框.例如 * border-radius -border-*-radius(top,left,right,bo ...
- BZOJ 1025 SCOI2009 游戏 动态规划
标题效果:特定n.行定义一个替代品1~n这种更换周期发生后,T次要(T>0)返回到原来的顺序 找到行的所有可能的数 循环置换分解成若干个,然后行位移数是这些周期的长度的最小公倍数 因此,对于一些 ...
- The Stern-Brocot Number System(排序二进制)
The Stern-Brocot Number System Input: standard input Output: standard output The Stern-Brocot tree i ...
- POJ 3233 Matrix Power Series(矩阵高速功率+二分法)
职务地址:POJ 3233 题目大意:给定矩阵A,求A + A^2 + A^3 + - + A^k的结果(两个矩阵相加就是相应位置分别相加).输出的数据mod m. k<=10^9. 这 ...
- Git学习笔记1--Git原理简单介绍
Git是一个分布式的版本号控制工具,假设想用github等版本号控制系统,核心就是git,以下简介一些git的基础原理,原文:http://git-scm.com/book/en/Getting-St ...
- 採用Hexo 搭建Team Blog
採用Hexo 搭建Team Blog 首先你要会使用Git 已经GitHub,然后让我们了解下什么是静态Blog 静态博客是指 不须要数据库驱动,拥有丰富模板,通过模板标记语言生成简单html css ...
- 关于webbrowser控件自动登陆的问题
原文:关于webbrowser控件自动登陆的问题 楼主dtb(陈少)2004-03-04 22:16:55 在 VB / 网络编程 提问 请问怎么用webbrowser自动登陆www.jp168.co ...