最新评论
小伦 2009-04-20 13:03
请问:执行浅拷贝时,如果字段是值类型则复制其值到新的内存中,如果是引用类型,则复制其引用地址到新内存中,那么b.A更改了如何会影响到a.A呢?
Prewin 2008-04-25 11:13
.net新手群。60679146新鲜创建。常期在线,刻苦提高,分享进度,共同进步!广告时间多有不便,还望包涵
每过几天时间都会有一个专题,希望大家踊跃讨论
分享好的文章,帖子
今日专题:反射 2008年4月25日
每过几天时间都会有一个专题,希望大家踊跃讨论
分享好的文章,帖子
今日专题:反射 2008年4月25日
镜涛 2008-04-25 04:44
对引用类型
浅克隆复制地址,内存中知识多了一个存地址的空间;
深科隆新建一个完全与被拷贝者相同的对象并赋值,内存使用加倍。
浅克隆复制地址,内存中知识多了一个存地址的空间;
深科隆新建一个完全与被拷贝者相同的对象并赋值,内存使用加倍。
没有昵称 2008-04-25 01:34
sorry,你的说法是不正确的。“只传递一个引用指针”不是拷贝。
浅拷贝是指:在拷贝时只复制类的所有字段的值;如果字段是值类型,则复制其值;如果字段是引用类型,则复制一个引用指针。
深拷贝是指:在拷贝时复制类的所有字段的值,如果字段是值类型,则复制过来;如果字段是引用类型,则会将这个引用指针指向的对象也克隆一下。
所以,浅拷贝是指只拷贝一层、不递归拷贝;而深拷贝是指递归拷贝。
举例:
MyClass
{
int A;
object B;
MyClass Copy();
}
object obj = new object();
MyClass a = new MyClass();
a.A = 1;
a.B = obj;
MyClass b = a.Copy();
不管是浅拷贝还是深拷贝,a和b指向的都不是同一个对象了。而且因为字段A是值类型,所以a.A和b.A的值相等但不在同一个内存地址上。
如果是浅拷贝,此时a.B与b.B是指向的同一个引用;因为只是复制了a这个指针的值也就是obj的内存地址;
如果是深拷贝,则此时a.B与b.B就不是指向的同一个引用了。b.B应该是指向a.B克隆后的一个新的内存地址。
所以他们的实现就如:
浅拷贝:
MyClass MyClass::Copy
{
MyClass copy = new MyClass();
copy.A = this.A;
copy.B = this.B;
return copy;
}
深拷贝:
MyClass MyClass::Copy
{
MyClass copy = new MyClass();
copy.A = this.A;
copy.B = this.B.Copy(); // 假设 this.B 有一个 Copy 方法来实现深拷贝。
return copy;
}
浅拷贝是指:在拷贝时只复制类的所有字段的值;如果字段是值类型,则复制其值;如果字段是引用类型,则复制一个引用指针。
深拷贝是指:在拷贝时复制类的所有字段的值,如果字段是值类型,则复制过来;如果字段是引用类型,则会将这个引用指针指向的对象也克隆一下。
所以,浅拷贝是指只拷贝一层、不递归拷贝;而深拷贝是指递归拷贝。
举例:
MyClass
{
int A;
object B;
MyClass Copy();
}
object obj = new object();
MyClass a = new MyClass();
a.A = 1;
a.B = obj;
MyClass b = a.Copy();
不管是浅拷贝还是深拷贝,a和b指向的都不是同一个对象了。而且因为字段A是值类型,所以a.A和b.A的值相等但不在同一个内存地址上。
如果是浅拷贝,此时a.B与b.B是指向的同一个引用;因为只是复制了a这个指针的值也就是obj的内存地址;
如果是深拷贝,则此时a.B与b.B就不是指向的同一个引用了。b.B应该是指向a.B克隆后的一个新的内存地址。
所以他们的实现就如:
浅拷贝:
MyClass MyClass::Copy
{
MyClass copy = new MyClass();
copy.A = this.A;
copy.B = this.B;
return copy;
}
深拷贝:
MyClass MyClass::Copy
{
MyClass copy = new MyClass();
copy.A = this.A;
copy.B = this.B.Copy(); // 假设 this.B 有一个 Copy 方法来实现深拷贝。
return copy;
}

