C#中深拷贝和浅拷贝的例子

C#中有两种类型变量,一种是值类型变量,一种是引用类型变量。对于前者,copy是属于全盘复制;
而对于后者,一般的copy只是浅copy,相当于只传递一个引用指针一样。因此对于后者进行真正copy的时候,也是最费事的,具体的说,必须为其实现ICloneable接口中提供的Clone方法,示例代码如下:

public   class  Test
{    
    
public   class  Person : ICloneable
    {
        
public   int  ID;
        
public   int  age;
        
public   void  Show()
        {
            Console.WriteLine(
" ID:{0} 年龄:{1} " ,ID, age);
        }
        
public   object  Clone()
        {
            Person newPerson 
=   new  Person();
            newPerson.ID 
=   this .ID;
            newPerson.age 
=   this .age;      
            
return  newPerson;
        }
    }
    
public   static   void  ShowPersons(Person[] persons)
    {
        
for  ( int  i = 0 ; i < persons.GetLength( 0 ); i ++ )
        {
            persons[i].Show();
        }
    }
    
static   void  Main( string [] argv)
    {
        Random rnd 
=   new  Random( unchecked (( int )DateTime.Now.Ticks));
        Person[] persons 
=   new  Person[ 4 ];
        
for  ( int  i = 0 ;i < persons.GetLength( 0 );i ++ )
        {
            persons[i] 
=   new  Person();
            persons[i].ID 
=  rnd.Next() % 10 ;
            persons[i].age 
=  rnd.Next() % 50 ;
        }
        
// 打印原始数组
        Console.WriteLine( " 打印原始数组 " );
        ShowPersons(persons);
        
// 深拷贝
        Person[] personsCopied  =   new  Person[ 4 ];
        
for  ( int  i = 0 ;i < personsCopied.GetLength( 0 );i ++ )
        {
            personsCopied[i] 
=  (Person)persons[i].Clone();
        }
        
// persons.CopyTo(personsCopied, 0);
        Console.WriteLine( " 深拷贝的数组 " );
        ShowPersons(personsCopied);
//        // 浅拷贝
//       Person[] personsCloned = (Person[])persons.Clone();
//       Console.WriteLine("浅拷贝的数组");
//       ShowPersons(personsCloned);
        
// 对原数组做修改
        persons[ 2 ].ID  +=   10 ;
        Console.WriteLine(
" 打印修改后的原始数组 " );
        ShowPersons(persons);
        Console.WriteLine(
" 深拷贝的数组应该不改变 " );
        ShowPersons(personsCopied);
//       Console.WriteLine("浅拷贝的数组应该改变");
//       ShowPersons(personsCloned);
    }
}

某次的运行结果:

 

对于上例,在进行深拷贝时,必须先为对象数组new新的空间,而数组中的对象成员则由实现了接口的相应方法分配新的空间,由深拷贝出来的新对象数组不会因为原数组的改变而改变,相反,对于注释行中仅作了浅表复制的personsCloned而言则会受原数组的影响。

另外注意 persons.CopyTo(personsCopied, 0); 这一句并不是对personsCopied进行深表复制,数组直接拷贝是拷贝的指向同一个对象的引用,因为在C#中对于存放引用类型的数组,数组本身的引用类型和数组中元素的引用类型不能混为一谈,此时的数组仅相当于一个容器,所以对于容器本身和容器中存放的东西是要分别进行实例化的。呵呵困扰我很多天的问题贴上来做个备忘哈

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值