以前一直在寫c++,最近玩起了c#,才發現c#的深拷貝好麻煩。
我在程式的乙個類class1裡新建了乙個list,用於存放另乙個類class2的例項,而class2中另有乙個list。然後某些操作需要將其中乙個class1例項的資料拷貝到另乙個例項當中。我本以為用類似c++的vector的拷貝方法就可以:
a.list = new
list
(b.list);
結果我在改變b.list當中的list內某個元素的值時,發現a.list裡面對應元素的值也改變了。原因是以上方法只是淺拷貝,只拷貝了引用。
c#裡有兩種資料型別,一種是值型別,如int等基礎型別,而同時struct也是直接值傳遞的;一種是引用型別,如自定義的類,包括string其實也是引用型別,只不過內部做了一些處理。當然,struct裡面有引用型別的話,這些引用型別還是只傳了引用。new list(list)
也只不過是將list裡的每個元素的引用傳給了新的list,因此改變其中乙個必然導致另外乙個改變。
網上有許多深拷貝的方法,什麼序列化、反射等等,暫時還看不懂。倒是有乙個方法比較簡便,就是自定義的類繼承icloneable這個基類,然後在類內部實現public object clone()
方法。類結構大致如下:
class class2 : icloneable
}
以上**裡class2的list裡是值型別,可以直接用new list(list)
來拷貝。到了class1裡,情況就不一樣了:
class class1 : icloneable
}
這樣就可以完成深拷貝。拷貝建構函式裡面還是繼續用淺拷貝,而需要深拷貝時呼叫clone()函式。 講一下我自己理解的「賦值「,「淺拷貝」,「深拷貝」
今天來講一下我自己理解的 賦值 淺拷貝 深拷貝 1.賦值 賦值 賦值只是將a的引用賦值給了b a 1,2,3,4,5 b a print a 執行結果 1,2,3,4,5 6 a如上面所有,a只是將b的引用給了b,而b在尾部新增了乙個元素6則會影響到a。這也是 網上 物件賦值實際上是物件的引用 的體...
C 學習 深拷貝與淺拷貝
c 中在類中預設的拷貝函式 系統自動生成的 這就是淺拷貝。只是簡單的將成員內容複製。例如下面的 include include using namespace std class array array const array arr arrat using namespace std int ma...
python列表的複製,扯一下淺拷貝與深拷貝的區別
將乙個列表的資料複製到另乙個列表中。使用列表 可以呼叫copy模組 import copy a 21,22,23,24,a b c d 25,26 b a 直接賦值 c a 淺拷貝d copy.copy a 淺拷貝e copy.deepcopy a 深拷貝 看看深拷貝與淺拷貝的區別 在a陣列的最尾處...