测试,不应该只是肤浅的~~

读书备忘:C#浅拷贝与深拷贝

上一篇 / 下一篇  2007-06-06 09:36:30

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

public class MyClass
{
    
class InstanceA:ICloneable
 
{
  
public int x;
  
public InstanceB B;
  
public InstanceA(){}
  
public InstanceA(int X,InstanceB b)
  
{
   
this.x=X;
   
this.B=b;
  }

  
object ICloneable.Clone()
  
{
   
return this.Clone();
  }

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

 }

 
class InstanceB
 
{
  
public int y;
  
public InstanceB Copy()
  
{
    
return this.MemberwiseClone() as InstanceB; 
  }

 }

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

}


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2021-01-14  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 4590
  • 日志数: 10
  • 建立时间: 2006-12-15
  • 更新时间: 2009-10-24

RSS订阅

Open Toolbar