C# 浅拷贝
浅拷贝和深拷贝主要体现在引用成员上.先上例子:
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.下节解析............
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。