C#解決引用類型的深度克隆問題
前言
在C#中我們new一個引用類型的對象稱為對象1,如果我們再次new一個引用類型的對象稱為對象2,如果直接將第一個對象直接賦值給第二個對象,然后如果我們這時候改變對象2的值,你會發(fā)現(xiàn)對象1的值也會被更改,這就是引用類型的淺克隆,因為引用類型的復制本質上并沒有開辟新的內(nèi)存,兩個對象都是指向同一個內(nèi)存,所以改變其中一個對象,另一個對象的值也會被改變。本文就來介紹如何讓引用類型的對象復制以后各自擁有獨立的內(nèi)存從而實現(xiàn)一個對象值的變化不會影響別的對象。
1、C#的淺克隆舉例
我們首先定義一個類稱為TestClone,這個類有一個成員變量a。
class TestClone
{
public int a = 0;
}
第一步、 然后我們new一個TestClone類的對象稱為testClone1 ,然后將它的成員a賦值為10;
第二步、 接著我們再次new一個TestClone類的對象稱為testClone2,然后將testClone1 賦值給testClone2;
第三步、更改testClone2的成員a的值為100。
最后、輸出testClone1.a的值,值為100,我們會發(fā)現(xiàn)雖然我們沒有直接給testClone1.a賦值,但是由于TestClone是一個引用類型,所以testClone1 和testClone2都是指向了同一個內(nèi)存地址,所以我們更改testClone2的值,實際上也就是更改testClone1的值,這種對象的復制方式我們稱為淺克隆。
//淺克隆
TestClone testClone1 = new TestClone();
testClone1.a = 10;
TestClone testClone2 = new TestClone();
testClone2 = testClone1;
testClone2.a = 100;
Console.WriteLine(testClone1.a );//輸出值為100
2、C#的深克隆舉例
我們發(fā)現(xiàn)淺克隆看起來復制了多個對象,實際上值并沒有被復制,所以這里我們介紹深克隆,深克隆的目的就是為同一個類的不同對象創(chuàng)建不同的內(nèi)存,這樣每個對象的值都是獨立的,更改一個對象的值不會影響別的對象的值。
在下面的代碼中我調用了一個第三方的類JsonConvert,這個類引用Newtonsoft.Json這個dll

第一步、首先new一個對象testClone3 ,并將它的成員a設置為10。
第二步、調用JsonConvert.SerializeObject方法將對象序列化一個字符串。
第三步、調用JsonConvert.DeserializeObject將字符串反序化為TestClone 類型的對象并賦值給testClone4
第四步、設置 testClone4.a = 100;
最后、輸出testClone3.a的值,該值為10,你會發(fā)現(xiàn)testClone3的值并沒有隨著testClone4的值改變而改變,這樣這兩個對象就是具備獨立的內(nèi)存了,實現(xiàn)了深克隆。
//深克隆
TestClone testClone3 = new TestClone();
testClone3.a = 10;
TestClone testClone4= JsonConvert.DeserializeObject<TestClone> (JsonConvert.SerializeObject(testClone3));
testClone4.a = 100;
Console.WriteLine(testClone3.a);//輸出值為10
到此這篇關于C#解決引用類型的“深度”克隆問題的文章就介紹到這了,更多相關C#深度”克隆問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C# 字符串string和內(nèi)存流MemoryStream及比特數(shù)組byte[]之間相互轉換
本文主要介紹字符串string和內(nèi)存流MemoryStream及比特數(shù)組byte[]之間相互轉換的方法,需要的小伙伴可以參考一下。2016-05-05

