一文弄懂C#淺克隆與深克隆
在C#中,淺克?。⊿hallow Clone)和深克?。―eep Clone)是兩種常見(jiàn)的對(duì)象克隆技術(shù),用于創(chuàng)建對(duì)象的新副本。
它們的主要區(qū)別在于復(fù)制對(duì)象的層次和屬性的處理方式。
淺克?。⊿hallow Copy)
當(dāng)進(jìn)行淺克隆時(shí),一個(gè)新的對(duì)象實(shí)例被創(chuàng)建,原始對(duì)象的所有字段(成員變量)的值都被復(fù)制到新對(duì)象中。但是,如果這些字段包含引用類型(如類、數(shù)組或其他復(fù)雜類型),那么復(fù)制的是引用而不是引用的對(duì)象內(nèi)容本身。這意味著新舊對(duì)象中的引用指向的是內(nèi)存中的同一塊地址,對(duì)引用類型字段的任何修改會(huì)影響到原對(duì)象和克隆對(duì)象。
淺克隆只是簡(jiǎn)單地復(fù)制對(duì)象的引用,而不是實(shí)際的對(duì)象內(nèi)容。因此,淺克隆通常只適用于值類型或可比較的對(duì)象,其中所有屬性都進(jìn)行了復(fù)制。
在淺克隆中,當(dāng)對(duì)象被復(fù)制時(shí)只復(fù)制它本身和其中包含的值類型的成員變量,而引用類型的成員對(duì)象并沒(méi)有復(fù)制。
代碼示例:
public class MyClass
{
public int Value; // 值類型字段
public AnotherClass ReferenceTypeField; // 引用類型字段
}
// 淺克隆實(shí)現(xiàn)
public MyClass ShallowClone()
{
var clone = (MyClass)this.MemberwiseClone(); // 使用Object類提供的MemberwiseClone方法
return clone;
}在這個(gè)例子中,MyClass的Value字段會(huì)得到復(fù)制,而ReferenceTypeField字段則只是復(fù)制了其引用,所以原對(duì)象和克隆對(duì)象的這個(gè)字段實(shí)際上指向的是同一個(gè)AnotherClass實(shí)例。
深克?。―eep Copy)
深克隆不僅復(fù)制對(duì)象本身的值,還會(huì)遞歸地復(fù)制所有引用類型的字段所引用的對(duì)象,并為它們創(chuàng)建新的實(shí)體。這樣,克隆后的對(duì)象與原對(duì)象具有完全獨(dú)立的數(shù)據(jù)狀態(tài)。
深克隆通常需要自定義實(shí)現(xiàn),因?yàn)樗婕暗綄?duì)每個(gè)引用類型的字段執(zhí)行相應(yīng)的復(fù)制操作,這可能包括循環(huán)引用和其他復(fù)雜情況。
深克隆通常用于復(fù)雜對(duì)象結(jié)構(gòu),其中對(duì)象包含引用其他對(duì)象的屬性,或者需要完全隔離新舊對(duì)象的狀態(tài)。
簡(jiǎn)單來(lái)說(shuō),在深克隆中,除了對(duì)象本身被復(fù)制外,對(duì)象所包含的所有成員變量也將復(fù)制。
代碼示例:
public class MyClass : ICloneable
{
public int Value;
public AnotherClass ReferenceTypeField;
// 深克隆實(shí)現(xiàn)
public object Clone()
{
var clone = new MyClass();
clone.Value = this.Value;
clone.ReferenceTypeField = this.ReferenceTypeField?.DeepClone(); // 假設(shè)AnotherClass也實(shí)現(xiàn)了深克隆
return clone;
}
}
public class AnotherClass : ICloneable
{
// 其他屬性...
public object Clone() => MemberwiseClone(); // 如果AnotherClass沒(méi)有引用其他復(fù)雜類型,MemberwiseClone可以滿足深克隆
// 否則也需要類似上述MyClass的深克隆邏輯
}在深克隆中,MyClass的ReferenceTypeField也會(huì)創(chuàng)建一個(gè)全新的AnotherClass實(shí)例來(lái)保證數(shù)據(jù)隔離性。當(dāng)然,具體實(shí)現(xiàn)取決于類結(jié)構(gòu)和引用類型的具體行為。
注意:在 C#語(yǔ)言中,如果需要實(shí)現(xiàn)深克隆,可以通過(guò)序列化(Serialization)等方式來(lái)實(shí)現(xiàn)。需要注意的是能夠?qū)崿F(xiàn)序列化的對(duì)象其類必須實(shí)現(xiàn)Serializable接口,否則無(wú)法實(shí)現(xiàn)序列化操作。
到此這篇關(guān)于一文弄懂C#淺克隆與深克隆的文章就介紹到這了,更多相關(guān)C#淺克隆與深克隆內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Unity Blend Tree動(dòng)畫混合樹使用入門教程
這篇文章主要為大家詳細(xì)介紹了Unity Blend Tree動(dòng)畫混合樹使用入門教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
C#使用WebClient實(shí)現(xiàn)文件上傳的操作步驟
這篇文章主要介紹了C#使用WebClient實(shí)現(xiàn)文件上傳的操作步驟,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-11-11
C#自定義RSA加密解密及RSA簽名和驗(yàn)證類實(shí)例
這篇文章主要介紹了C#自定義RSA加密解密及RSA簽名和驗(yàn)證類,實(shí)例分析了C#實(shí)現(xiàn)RSA加密解密及RSA簽名和驗(yàn)證的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
C#中List轉(zhuǎn)IList的實(shí)現(xiàn)
本文主要介紹了C#中List轉(zhuǎn)IList的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
使用JsonConverter處理上傳文件的路徑問(wèn)題
我們上傳一個(gè)文件,把文件保存到服務(wù)器上,會(huì)有一個(gè)明確的物理路徑,由于需要從前端訪問(wèn)這個(gè)文件,還需要web服務(wù)器中的一個(gè)虛擬路徑,我們可以使用JsonConverter 來(lái)自動(dòng)處理一下,這篇文章主要介紹了使用JsonConverter處理上傳文件的路徑,需要的朋友可以參考下2022-12-12
C# 實(shí)現(xiàn)視頻監(jiān)控系統(tǒng)(附源碼)
這篇文章主要介紹了C# 如何實(shí)現(xiàn)視頻監(jiān)控系統(tǒng),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-02-02

