转:C#之深拷贝和浅拷贝的区别

原文地址http://hi.baidu.com/shenlun/blog/item/228796c205655f190ef477f5.html

所有的基元类型,结构,枚举都无深拷贝和浅拷贝之分,比如:
Int32 a=1;
Int32 b=a;
b=2;
(在执行b=2后,a还是等于1,说明a和b是被分配在线程堆栈上不同空间,彼此之间不受影响)

对于引用类型来说,有深拷贝和浅拷贝之分
(引用类型的定义:凡是用class定义的都是引用类型,不过在这里要强调引用类型和基元类型是存在交集的,比如String,它既是引用类型也是基元类型,只要不用NEW也可以事例化就可以说是基元类型,比如:String a="沈伦")
下个写两个类简单的阐述下深拷贝和浅拷贝的区别
class a
{
int a1;
string a2;
b a3;
}

class b
{
int b1;
}

执行以下代码:
a temp1=new a();
a temp2=temp1;
temp2.a1=3;
(在执行temp2.a1=3后,其实temp1.a1也变成了3,因为在执行a temp2=temp1时,temp1是把指向对象的地址赋给temp2,最终它们两都是指向同一个对象)

如何将类a进行深拷贝,修改代码如下
class a:Iconleable
{
int a1;
string a2;
b a3;
public object conle()
{
a sl=this.memberwiseconle() as a;
return sl;
}
再次执行以下代码
a temp1=new a();
a temp2=temp1.conle() as a;
temp2.a1=3;
(这次对temp2.a1=3后,不会影响temp1.a1的值,在对象方法conle中,进行了浅拷贝,字段成员如a1,a2都被拷贝放入一个新的对象里,而a3只是拷贝了引用地址,所以若在代码中改变temp2.a3.b1的值后,temp1.a3.b1的值也被改变)

再修改类b的代码
class b:Iconleable
{
int b1;
public object conle()
{
b lun=this.memberwiseconle() as b
return lun;
}
(这时,类a的对象可以被完全深拷贝,在执行a temp2=temp1.conle() as a后,temp1和temp2里的所有成员都是被分配在不同的空间里,互相不影响)
}

posted @ 2010-07-19 11:05  希腊字符  阅读(297)  评论(0编辑  收藏  举报