读书释疑--C#浅拷贝与深拷贝

读书释疑--C#浅拷贝与深拷贝:
MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。
深拷贝,即实现ICloneable接口.ICloneable可用于深拷贝和浅拷贝
请看下面理解那句话.

None.gif using  System;
None.gif
using  System.Collections.Generic;
None.gif
None.gif
public   class  MyClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
class InstanceA:ICloneable
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif  
public int x;
InBlock.gif  
public InstanceB B;
ExpandedSubBlockStart.gifContractedSubBlock.gif  
public InstanceA()dot.gif{}
InBlock.gif  
public InstanceA(int X,InstanceB b)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif   
this.x=X;
InBlock.gif   
this.B=b;
ExpandedSubBlockEnd.gif  }

InBlock.gif  
object ICloneable.Clone()
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif   
return this.Clone();
ExpandedSubBlockEnd.gif  }

InBlock.gif  
public InstanceA Clone()
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    InstanceA A
=this.MemberwiseClone() as InstanceA;
InBlock.gif    A.B
=this.B.Copy();
InBlock.gif   
return A;   //深复制
InBlock.gif  
//  return (InstanceA)this.MemberwiseClone();  //浅复制
InBlock.gif   
//return new InstanceA(this.x,this.B);     //use this can't get deep copy too..
InBlock.gif
   
ExpandedSubBlockEnd.gif  }

ExpandedSubBlockEnd.gif }

InBlock.gif 
class InstanceB
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif  
public int y;
InBlock.gif  
public InstanceB Copy()
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    
return this.MemberwiseClone() as InstanceB; 
ExpandedSubBlockEnd.gif  }

ExpandedSubBlockEnd.gif }

InBlock.gif 
InBlock.gif 
public static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif    InstanceA obj1
=new InstanceA();
InBlock.gif    obj1.x
=1;
InBlock.gif    obj1.B
=new InstanceB();
InBlock.gif    obj1.B.y
=2;
InBlock.gif    
InBlock.gif  InstanceA obj2
=obj1.Clone();
InBlock.gif  obj2.x
=3;
InBlock.gif  obj2.B.y
=4;
InBlock.gif  Console.WriteLine(
"Obj1.x is:{0} \t obj1.B.y={1}",obj1.x,obj1.B.y);
InBlock.gif     Console.WriteLine(
"Obj2.x is:{0} \t obj2.B.y={1}",obj2.x,obj2.B.y);
InBlock.gif  Console.ReadLine();
ExpandedSubBlockEnd.gif }

ExpandedBlockEnd.gif}

None.gif

转载于:https://www.cnblogs.com/solo/archive/2007/03/02/661944.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值