c 淺度複製和深度複製

2021-05-24 07:30:41 字數 2149 閱讀 7336

有時候我們需要根據乙個物件建立另外乙個相同物件,也就是所謂的複製。複製又分為淺度複製(也有叫影子複製)和深度複製。

主要的差別是對於引用型別而言。

淺度複製對引用型別只複製引用,及複製後源引用與目標引用的引用型別是指向都乙個物件,操作其中乙個,另外乙個也會受印像。

深度複製者源引用和目標引用物件的是兩個不同的物件,操作互不影響。

淺度複製是直接完全把棧的內容拷貝乙份而已。而深度複製把對應的堆內容也拷貝了乙份。

淺度複製可以直接呼叫system.object.memberwiseclone()這個受保護的方法就可以了。

而深度引用根據c#的規範實現icloneable介面即可。

**如下

1:  

using system;

2:  

using system.collections.generic;

3:  

using system.linq;

4:  

using system.text;

5:
6:  

namespace testcopy

7:
15:  

public element getcopy()

16:
19:      }
20:  

public

class test : icloneable

21:
28:
29:  

public test getcopy()

30:
33:
34:  

public

object clone()

35:
38:
39:      }
40:  

class program

41:      ,",e1.member,e2.member);
47:              e1.member = 11;
48:              console.writeline(",", e1.member, e2.member);
49:
50:              test t1 = new test(e2);
51:              test t2 = t1.getcopy();
52:              test t3 = (test)t1.clone();
53:              console.writeline(",,",t1.tmember.member,t2.tmember.member,t3.tmember.member);
54:              t1.tmember.member = 11;
55:              console.writeline(",,", t1.tmember.member, t2.tmember.member, t3.tmember.member);
56:              console.readkey();
57:          }
58:      }
59:
60:  }

element是乙個包含乙個值型別的類。所以沒有淺度複製與深度複製的差別

而test是乙個包含有乙個引用型別的類。t1是源物件,t2是用淺度複製出來的物件,t3是深度複製出來的物件。

根據執行結果可以發現,t1,t2的tmenmber欄位其實是同乙個東西。t3的tmember欄位是和他們不同的。

差別就在於深度複製是有完全new乙個新的物件出來的。

最後要提的是 深度複製是乙個遞迴的過程。

假設現在又乙個新類a包含乙個test型別的字段。

對a設計深度複製時就要呼叫test的深度複製函式。

深度複製和淺度複製

深度複製和淺度複製的區別在於有沒有為拷貝出的新物件重新分配一塊記憶體區域。淺度拷貝即直接賦值,拷貝的只是原始物件的引用,在堆中仍然公用一塊記憶體,而深度拷貝為新物件在堆中重新分配一塊記憶體,所以對新物件的操作不會影響原始物件 public class person implements clonea...

淺度複製 深度複製

深度複製 deep copy 從乙個變數到另乙個變數按值複製物件,即產生乙個和原物件相同的並且沒有任何引用聯絡的物件。淺度複製 shallow copy 只複製物件的基本型別,而引用型別仍屬於原來的物件。可以使用systrm.object的memberwiseclone 方法來完成,這是乙個受保護的...

java的深度複製和淺度複製

1.比如user類中包含了address類 則淺度複製只是複製了user類,並沒有複製user裡面的address類 而深度複製則是兩者都複製了 具體 如下 user類 class user implements cloneable override protected object clone t...