詳解c# 深克隆與淺克隆
前言
我們都知道m(xù)emberwiseclone 會(huì)將淺克隆。
什么是淺克隆?如何深克隆呢?
正文
public class good{
private good(){
oneclass=new class{
int id=8;
string name='id';
}
}
private static good __good;
private static good __good=new good();
public good createinstance()
{
return __good.memberwiseclone();
}
public int a=0;
public string b="ab";
pulic class oneclass;
}
測(cè)試:
void main()
{
var student1=good.createinstance();
var student2=good.createinstance();
student1.oneclass.id=9;
console.log('student2 oneclass.id{0}',student2.oneclass.id);
}
這里我們得出了結(jié)果為9;
ok,那么這真的是個(gè)匪夷所思的問(wèn)題,明明兩個(gè)對(duì)象啊。
那么回歸到淺克隆上。
當(dāng)克隆good的時(shí)候是這樣的。
讓good的classone的引用給了新的克隆對(duì)象。
那么如何深克隆呢?
深克隆其實(shí)就是將對(duì)象序列化,也就是說(shuō)要深克隆的話(huà)必須對(duì)象系列化;
public class SerializeHelper
{
public static string Serializable(object target)
{
using (MemoryStream steam=new MemoryStream())
{
new BinaryFormatter().Serialize(steam,target);
return Convert.ToBase64String(steam.ToArray());
}
}
public static T Derializable<T>(string target)
{
byte[] targetArray = Convert.FromBase64String(target);
using (MemoryStream steam =new MemoryStream(targetArray))
{
return (T)(new BinaryFormatter().Deserialize(steam));
}
}
public static T DeepClone<T>(T t)
{
return Derializable<T>(Serializable(t));
}
}
改變一個(gè)good 類(lèi)。
public class good{
private good(){
oneclass=new class{
int id=8;
string name='id';
}
}
private static good __good;
private static good __good=new good();
public good createinstance()
{
return SerializeHelper.DeepClone(__good.memberwiseclone());
}
public int a=0;
public string b="ab";
pulic class oneclass;
}
測(cè)試一下:
void main()
{
var student1=good.createinstance();
var student2=good.createinstance();
student1.oneclass.id=9;
console.log('student2 oneclass.id{0}',student2.oneclass.id);
}
以上就是詳解c# 深克隆與淺克隆的詳細(xì)內(nèi)容,更多關(guān)于c# 深克隆與淺克隆的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
WPF實(shí)現(xiàn)繪制統(tǒng)計(jì)圖(柱狀圖)的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何基于WPF實(shí)現(xiàn)實(shí)現(xiàn)統(tǒng)計(jì)圖(柱狀圖)的繪制,文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們學(xué)習(xí)WPF有一定幫助,感興趣的可以了解一下2022-07-07
C#通過(guò)ADO.NET訪(fǎng)問(wèn)數(shù)據(jù)的方法詳解
在 C# 的應(yīng)用開(kāi)發(fā)中,數(shù)據(jù)訪(fǎng)問(wèn)是極為關(guān)鍵的部分,ADO.NET作為.NET 框架下用于數(shù)據(jù)訪(fǎng)問(wèn)的核心技術(shù),能夠幫助開(kāi)發(fā)者便捷地與各類(lèi)數(shù)據(jù)源進(jìn)行交互,本文將深入剖析ADO.NET,帶你掌握使用 C# 通過(guò)ADO.NET訪(fǎng)問(wèn)數(shù)據(jù)的方法,需要的朋友可以參考下2025-02-02
C#中Sleep() 和 Wait()的區(qū)別小結(jié)
Sleep()和 Wait()是兩個(gè)不同的方法,用于控制線(xiàn)程的執(zhí)行,本文主要介紹了C#中Sleep()和Wait()的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04
C#中使用HttpDownLoadHelper下載文件實(shí)例
這篇文章主要介紹了C#中使用HttpDownLoadHelper下載文件的方法,并實(shí)例講述了在webfrom中與在mvc中的實(shí)現(xiàn)方法,需要的朋友可以參考下2014-10-10
C#從foreach語(yǔ)句中枚舉元素看數(shù)組詳解
這篇文章主要給大家介紹了關(guān)于C#從foreach語(yǔ)句中枚舉元素看數(shù)組的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-05-05
C#Url操作類(lèi)封裝、仿Node.Js中的Url模塊實(shí)例
這篇文章主要介紹了C#Url操作類(lèi)封裝、仿Node.Js中的Url模塊,實(shí)例分析了C#Url操作類(lèi)封裝的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-10-10
UnityUI中繪制線(xiàn)狀統(tǒng)計(jì)圖
這篇文章介紹了UnityUI中繪制線(xiàn)狀統(tǒng)計(jì)圖的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
C#運(yùn)算符大全_各種運(yùn)算符號(hào)的概述及作用
以下是對(duì)C#中各種運(yùn)算符號(hào)的說(shuō)明及作用進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10
c# 免費(fèi)組件html轉(zhuǎn)pdf的實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了c# 免費(fèi)組件html轉(zhuǎn)pdf的實(shí)現(xiàn)過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06

