C 原型模式(深拷貝 淺拷貝)

2022-02-16 13:09:46 字數 1761 閱讀 8669

建立原型

public

abstract

class

base

public

int age

public

base()

public base(string name, int

age)

//深拷貝

public

abstract

base clone();

//淺拷貝

public

abstract

base mclone();

}

接下來建立乙個peron類,繼承base,並且實現兩個複製方法

//

如果是要通過序列化來進行深拷貝的話,要打上serializable標籤

[serializable]

public

class

person : base

public person(string name, int

age)

: base

(name, age)

//////

深拷貝

/// ///

返回乙個全新的person物件

public

override

base clone()

//////

淺拷貝

/// ///

public

override base mclone() =>

//淺拷貝this.memberwiseclone() as

person;

}

main方法中呼叫,首先我們每次都建立新的person物件

static

void main(string

args)

執行結果:

可見如果建立物件如果開銷很大的話,每次用的時候都建立效率就會很低

接下來我們使用原型模式來建立重複的物件,呼叫mclone()淺拷貝

static

void main(string

args)

在console.readkey();處設定斷點,執行程式,開啟  除錯》視窗》即時,在右下角即時視窗輸入  *&name1  回車,*&name2   回車,檢視name1和name2的記憶體位址

我們可以看到,name1和name2的記憶體位址都是相同的,說明p2.name和p1.name是指向了同乙個引用。所以對於屬性是引用型別的物件,實現淺拷貝,所有的屬性引用只會指向同乙個物件,也就是說只要有乙個物件修改了name屬性,其他的物件的name屬性都會發生改變。

看一下執行結果

可以發現,只有第一次建立物件需要很大的開銷,通過原型複製的話是很快的。

接下來我們看一下深拷貝

static

void main(string

args)

執行和剛才相同的操作,來看一下記憶體位址

可以發現,p1和p2的name在記憶體中的位址是不一樣的, 就是說明深拷貝會將物件的所有非靜態屬性都複製乙份,如果碰到引用型別也會重新建立乙份,而不是複製指向物件的引用。

最後我們看一下執行結果

設計模式 原型模式深度理解淺拷貝深拷貝原理

一,棧 二,堆 先看看什麼是棧,什麼是堆,至於為什麼要這裡開頭就講棧和堆的解釋,原因後在後面有解釋,請往下看,直接上例項 淺拷貝例項 淺拷貝 public class weekreport implements cloneable serializable public void setemp st...

深拷貝淺拷貝,原型,型別校驗,遞迴深拷貝

遇見乙個問題,解決的時候衍生出了幾條底層原理。為此做一下總結 let arr 1 2 3 宣告乙個陣列,要求對陣列進行深拷貝 一 深拷貝和淺拷貝的區別 所有基礎資料型別 string,number,null,undefind,boolean 進行賦值時都是深拷貝 所有宣告的變數在賦值引用資料型別時,...

C 深拷貝 淺拷貝

c 深拷貝 淺拷貝 深拷貝 淺拷貝和直接指向引用的區別 深拷貝 淺拷貝都是重新開闢了記憶體空間,並且在新的記憶體空間裡面賦了物件本身 的值。直接指向引用是乙個物件直接指向另外乙個物件的引用,這兩個物件指向的是同一 塊記憶體空間,操作任乙個物件都會影響另外的物件。深拷貝和淺拷貝的區別 如果物件的成員都...