浅拷贝和深拷贝主要体现在引用成员上.先上例子:

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceCopyDemo{///<summary>///人类///</summary>publicsealedclassPerson{publicstringName{set;get;}publicuintage{set;get;}publicPersonpartner{set;get;}}}

对Person执行浅拷贝:

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceCopyDemo{classProgram{staticvoidMain(string[]args){Personi=newPerson();i.Name="Aonaufly";i.age=27;i.partner=newPerson(){Name="Kayer",age=18};Personi_1=i;Console.WriteLine("我的name:{0},copy的name:{1}",i.Name,i_1.Name);Console.WriteLine("我的Partner的Name:{0},copy的Partner的age:{1}",i.partner.Name,i_1.partner.Name);Console.WriteLine("==========================================================");i_1.partner.Name="Ainy";i_1.Name="CC";Console.WriteLine("我的name:{0},copy的name:{1}",i.Name,i_1.Name);Console.WriteLine("我的Partner的Name:{0},copy的Partner的age:{1}",i.partner.Name,i_1.partner.Name);Console.ReadLine();}}}

结果如下:

由于源对象和Copy对象的都指向同一块内存,互相直接的Update都会对另一个产生作用.

实际上 , 上述方案是不可取的.2对象都指向都一个地址,这不纯粹的浪费空间吗 ? 重点 :MemberwiseClone是C#用于实现浅拷贝的方案.

使用方法 :

①:继承 ICloneable

②:实现ICloneable的Clone方法

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceCopyDemo{///<summary>///人类///</summary>publicsealedclassPerson:ICloneable{publicstringName{set;get;}publicuintage{set;get;}publicPersonpartner{set;get;}//实现ICloneable接口publicobjectClone(){returnthis.MemberwiseClone();}}}

调用:

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceCopyDemo{classProgram{staticvoidMain(string[]args){Personi=newPerson();i.Name="Aonaufly";i.age=27;i.partner=newPerson(){Name="Kayer",age=18};Personi_1=(Person)i.Clone();Console.WriteLine("我的name:{0},copy的name:{1}",i.Name,i_1.Name);Console.WriteLine("我的Partner的Name:{0},copy的Partner的age:{1}",i.partner.Name,i_1.partner.Name);Console.WriteLine("==========================================================");i_1.partner.Name="Ainy";i_1.Name="CC";i_1.age=1;Console.WriteLine("我的name:{0},copy的name:{1}",i.Name,i_1.Name);Console.WriteLine("我的Partner的Name:{0},copy的Partner的age:{1}",i.partner.Name,i_1.partner.Name);Console.ReadLine();}}}

结果 :

只有引用类型public Person partner { set; get; } 指向的是同一块内存空间 . 值类型及String类型都是指向不同的内存空间.这才是浅拷贝.

深拷贝 : 就是将引用类型指向不同的内存空间,实现完全的Copy.下节解析............