建立原型
public接下來建立乙個peron類,繼承base,並且實現兩個複製方法abstract
class
base
public
int age
public
base()
public base(string name, int
age)
//深拷貝
public
abstract
base clone();
//淺拷貝
public
abstract
base mclone();
}
//main方法中呼叫,首先我們每次都建立新的person物件如果是要通過序列化來進行深拷貝的話,要打上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;
}
static執行結果:void main(string
args)
可見如果建立物件如果開銷很大的話,每次用的時候都建立效率就會很低
接下來我們使用原型模式來建立重複的物件,呼叫mclone()淺拷貝
static在console.readkey();處設定斷點,執行程式,開啟 除錯》視窗》即時,在右下角即時視窗輸入 *&name1 回車,*&name2 回車,檢視name1和name2的記憶體位址void main(string
args)
我們可以看到,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 深拷貝 淺拷貝 深拷貝 淺拷貝和直接指向引用的區別 深拷貝 淺拷貝都是重新開闢了記憶體空間,並且在新的記憶體空間裡面賦了物件本身 的值。直接指向引用是乙個物件直接指向另外乙個物件的引用,這兩個物件指向的是同一 塊記憶體空間,操作任乙個物件都會影響另外的物件。深拷貝和淺拷貝的區別 如果物件的成員都...