日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#深复制与浅复制

發布時間:2025/3/19 C# 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#深复制与浅复制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C#中對于數據的復制機制雖然簡單但是容易讓人誤解。C#數據類型大體分為值類型(value type)與引用類型(reference type)。對于值類型數據,復制的時候直接將數據復制給另外的變量,而對于引用型變量而言,復制時,其實只是復制了其引用。復制引用的方式叫淺復制,而逐一復制被復制對象的數據成員的方式稱為深復制。例如

Person p1=new Person{

??Name=”張三”,//為引用類型

??Address=new AddressInfo{//AddressInfo為地址信息類,為引用類型

??PostCode=100877,

??District=”beijing”

},

Age=20

};//初始化一個Person對象

?

如果現在有如下語句,

Person p2=p1;

P2.Address=new AddressInfo{PostCode=100878,District=”shanghai”};

那么,此時p1.Address.PostCode=?

因為Person的Address屬性為引用類型,因此,NET默認其復制方式為淺復制,即是說在P2=P1時,將P1.Address的引用傳給了P2.Adrress,即是P1.Address與P2.Address指向相同的內存空間。當改變P2的Address屬性時,P1.Address屬性也會相應改變。因此最后p1.Address.PostCode=100878。

?

NET中Object類提供了一個MemberwiseClone方法實現的就是上述機制。

要對對象實現深復制。我們可以通過實現ICloneable接口。

ICloneable接口只提供了一個Clone()抽象方法。只要在類中實現它即可。比如現在我要實現Person類的深復制。則可以如下

Public class Person :ICloneable

{

??//…………

?public Object ?Clone()

{

Person newPerson = (Person)this.MemberwiseClone();//先調用默認的復制機制

AddressInfo address=new AddressInfo{PostCode=this.Address.PostCode,District=this.Address.District};

?newPerson.Address=address;

?

return newPerson;?

}

?

}

?

這樣就實現對象的深復制。

可以這樣調用(續上面的代碼),p2=(Person)p1.Clone();此時再

P2.Address=new AddressInfo{PostCode=100878,District=”shanghai”};

P1的Address不再改變。

?

?

轉載自:http://blog.sina.com.cn/s/blog_4b0020f30100vh01.html

轉載于:https://www.cnblogs.com/dogxuefeng/p/4527377.html

總結

以上是生活随笔為你收集整理的C#深复制与浅复制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。