一、淺拷貝
1.什麼是"淺拷貝":
當針對乙個物件前拷貝的時候,對於物件的值型別成員,會複製其本身,對於物件的引用型別成員,僅僅複製物件引用,這個引用指向託管堆上的物件例項。
2.有乙個物件,包含引用型別的類成員和值型別的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);
crglfhonsole.writeline("拷貝之後,新的結構成員的字段值為,引用型別成員的字段值為", cinema2._film._name, cinema2._room._maxseat);
//修改拷貝之前引用型別的字段值
cinema1._f程式設計客棧ilm._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()
4.採用序列化和反序列化深拷貝,但必須把所有的類打上[serializable],測試**如下:
[serializable]
public class room
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#淺拷貝和深拷貝例項解析
本文位址:
淺拷貝和深拷貝解析
class name name private char p int len 物件析構時 出現coredump void playobj int main 執行結果 呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同 p指標被分配一次記憶體,但是程式結束時該記憶體卻被釋放了兩次,會...
C 賦值 淺拷貝 深拷貝和零拷貝解析
1.淺拷貝 淺拷貝只複製指向某個物件的指標,而不複製物件本身,新舊物件還是共享同一塊記憶體。2.深拷貝 深拷貝會另外創造乙個一模一樣的物件,新物件跟原物件不共享記憶體,修改新物件不會改到原物件。深拷貝和淺拷貝是只針對object和array這樣的引用資料型別的,示意圖大致如下 3.賦值與淺拷貝差異 ...
深拷貝和淺拷貝 完整例項
1 淺拷貝 對基本資料型別進行值傳遞,對引用資料型別進行引用傳遞般的拷貝,此為淺拷貝。2 深拷貝 對基本資料型別進行值傳遞,對引用資料型別,建立乙個新的物件,並複製其內容,此為深拷貝。3 淺拷貝 clone 示例 public class student implements cloneable p...