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)不是拆箱的范疇。