C# 關(guān)于new關(guān)鍵字的作用,方法在線程棧上的調(diào)用,裝箱和拆箱

new關(guān)鍵字的作用:

1.它計(jì)算類型及其基類型中定義的所有字段需要的字節(jié)數(shù),并且創(chuàng)建兩個(gè)額外的對(duì)象即類型對(duì)象指針,同步索引塊,這些成員也會(huì)算入對(duì)象大小。

2.它從托管堆中分配指定類型要求的字節(jié)數(shù),從而分配對(duì)象的內(nèi)存,分配的所有字節(jié)都設(shè)為零。

3.它初始化“類型對(duì)象指針”和“同步索引塊”成員。

4.調(diào)用類型的實(shí)例構(gòu)造函數(shù)。

5.返回一個(gè)地址給引用變量

方法在線程棧上的調(diào)用和執(zhí)行。

假設(shè) 有以下兩個(gè)方法

M1()

{

string name;

M2(name);

........

}

M2(string s)

{

int a;

int b;

.......

}

當(dāng)調(diào)用M1方法時(shí),將M1方法的局部變量壓入棧底,棧的最底部有一個(gè)返回地址,這個(gè)返回地址在M1 return的時(shí)候?qū)⒎祷?,代表M1方法的執(zhí)行結(jié)束,隨后來到M2方法這時(shí)候會(huì)將參數(shù)string s壓入棧,這時(shí)候棧又會(huì)有一個(gè)返回地址,當(dāng)方法M2 return后將返回至M1方法中,方法M2中的局部變量int a,int b,都將壓入棧中。如此到整個(gè)M1方法調(diào)用完成。

裝箱

裝箱即值類型向引用類型轉(zhuǎn)換時(shí)發(fā)生的操作。


對(duì)一個(gè)值類型進(jìn)行的裝箱,在內(nèi)部的操作:

1.在托管堆中分好內(nèi)存,其中包括了兩個(gè)額外成員(類型對(duì)象指針和同步索引塊)的內(nèi)存。

2.值類型的字段賦值到新分配的內(nèi)存。

3.返回對(duì)象的引用地址。現(xiàn)在的值類型就是一個(gè)引用類型了。

拆箱


拆箱即引用類型向值類型轉(zhuǎn)換時(shí)發(fā)生的操作。

拆箱的操作

1.如果為待拆箱對(duì)象為null,拋出NullReferenceException異常。(空引用異常)

2.如果引用指向的不是一個(gè)期望對(duì)象的已裝箱對(duì)象,拋出InvalidCastException異常。(指定轉(zhuǎn)換無效)


獲取已裝箱對(duì)象中各個(gè)字段的地址,這個(gè)過程就是“拆箱”

需要說明的是一般拆箱以后會(huì)伴隨著對(duì)象的拷貝,但拷貝操作已經(jīng)不是拆箱的范疇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容