在有些時候,我們需要從資料庫讀取資料填充物件或從硬碟讀取檔案填充物件,但是這樣做相對耗時。這時候我們就想到了物件的拷貝。本文即以例項形式解析了c#淺拷貝和深拷貝的用法。
c#中有兩種型別變數,一種 是值型別變數,一種是引用型別變數。對於前者,copy是屬於全盤複製;而對後
者,一般的copy只是淺copy,相當於只傳遞乙個引用指標一樣。因此 對於後者進行真正copy的時候,也是最費事的,具體的說,必須為其實現icloneable介面中提供的clone方法。
1.什麼是"淺拷貝":
當針對乙個物件淺拷貝的時候,對於物件的值型別成員,會複製其本身,對於物件的引用型別成員,僅僅複製物件引用,這個引用指向託管堆上的物件例項。
例如:有乙個物件,包含引用型別的類成員和值型別的struct成員
即:cinema包含 引用型別成員room和值型別成員film。
public class room}
public struct film}
public class cinema
public object clone()
}
3.測試拷貝後的效果①列印出原先物件 拷貝前值型別和引用型別成員的值
②對原先物件拷貝,列印出複製物件值型別和引用型別成員的值
③改變原先物件的值,再次列印原先物件的值型別和引用型別成員的值
④再次列印複製物件值型別和引用型別成員的值
static void main(string args)
,引用型別成員的字段值為", cinema1._film._name,cinema1._room._maxseat);
console.writeline("拷貝之後,新的結構成員的字段值為,引用型別成員的字段值為", cinema2._film._name, cinema2._room._maxseat);
//修改拷貝之前引用型別的字段值
cinema1._film._name = "極品飛車";
cinema1._room._maxseat = 80;
console.writeline("修改之後,結構成員的字段值為,引用型別成員的字段值為", cinema1._film._name, cinema1._room._maxseat);
console.writeline("修改之後,新的結構成員的字段值為,引用型別成員的字段值為", cinema2._film._name, cinema2._room._maxseat);
console.readkey();
}
執行結果如下:
分析:
淺拷貝關鍵點是對引用型別拷貝的是物件引用,這個引用指向託管堆上的物件例項。改變原對應引用型別的值,會影響到複製物件。
1.什麼是"深拷貝"
對引用成員指向的物件也進行複製,在託管堆上賦值原先物件例項所包含的資料,再在託管堆上建立新的物件例項。
2.通過對每個物件成員進行複製進行深拷貝
public object clone()
3.也可以通過序列化和反序列化進行深拷貝public object clone1()
public room(int maxseat) }
[serializable]
public struct film}
[serializable]
public class cinema
//淺拷貝
//public object clone()
////深拷貝 對每個物件成員進行複製
public object clone()
//使用序列化和反序列化進行複製
public object clone1()
}
5.測試拷貝後的效果
static void main(string args)
,引用型別成員的字段值為", cinema1._film._name,cinema1._room._maxseat);
console.writeline("拷貝之後,新的結構成員的字段值為,引用型別成員的字段值為", cinema2._film._name, cinema2._room._maxseat);
//修改拷貝之前引用型別的字段值
cinema1._film._name = "極品飛車";
cinema1._room._maxseat = 80;
console.writeline("修改之後,結構成員的字段值為,引用型別成員的字段值為", cinema1._film._name, cinema1._room._maxseat);
console.writeline("修改之後,新的結構成員的字段值為,引用型別成員的字段值為", cinema2._film._name, cinema2._room._maxseat);
console.readkey();
}
結果:
分析:
深拷貝後,兩個物件的引用成員已經分離,改變原先物件引用型別成員的值
並不會對複製物件的引用型別成員值造成影響。
c 中深拷貝與淺拷貝
如果沒有自定義複製建構函式,則系統會建立預設的複製建構函式,但系統建立的預設複製建構函式只會執行 淺拷貝 即將被拷貝物件的資料成員的值一一賦值給新建立的物件,若該類的資料成員中有指標成員,則會使得新的物件的指標所指向的位址與被拷貝物件的指標所指向的位址相同,delete該指標時則會導致兩次重複del...
Python中的複製 淺拷貝與深拷貝
id type以及value,id唯一標識乙個物件,相當於位址,id一樣,說明就是同乙個東西。type和value就是字面意思。比較的是value,is比較的是id,意思是 是否為同乙個物件 條件比 要嚴格。python一切均是物件,不可變物件有 數字 字串 元組等,為什叫不可變物件呢?難道我不能為...
C 深拷貝 與 淺拷貝
最近在寫一些c 程式,遇到個問題,記憶體會出錯,查了一些材料,終於發現問題所在了,原來碰到了傳說中的深拷貝和淺拷貝問題了,檢視一些材料,現在對這個問題做個總結 在類定義中,預設是淺拷貝,即 位拷貝 用在基本類中或者一些沒有指標的自定義型別中沒有一點問題,但是當遇到含有指標變數的自定義型別的時候,就會...