裝箱和拆箱
阿新 • • 發佈:2017-11-26
說明 沒有 復制 har add 類型轉換 width console 內存
裝箱:將值類型轉換成引用類型
int i = 1; //聲明一個值類型的變量,並給其賦值
object j = i;//將值類型賦值給引用類型,這裏就發生了裝箱操作,這個過程是隱式的。註意:此時,i 和j 只是值相同,他們並不在內從的同一個位置,這時,改變i或者j。都互相不影響。
裝箱的過程,相當於實例化一個引用類型的對象,然後把值類型的值放進去。
int i = 1;
object j = i;
i = 6;
j = 8;
console.writeLine(i+" "+j);
此時輸出的是 6 8 說明他們互相獨立。
拆箱:把引用類型轉換成值類型,需要顯示的轉換
一般,為了統一操作一些值類型的對象時,或者把值類型復制給一個方法的時候,用裝箱操作。
比如:一些方法的參數是Object類型,根據裏氏轉換,所以類型都可以賦值給父類型,所以用裝箱操作,把值類型裝箱,轉換成引用類型。
值類型: |
byte,short,int,long,float,double,decimal,char,bool 和 struct 統稱為值類型。 |
引用類型: |
string 和 class統稱為引用類型。 |
值類型變量聲明後,不管是否已經賦值,編譯器為其分配內存,存儲在內存的棧中。
引用類型當聲明一個類時,只在棧中分配一小片內存用於容納一個地址,而此時並沒有為其分配堆上的內存空間。當使用 new 創建一個類的實例時,分配堆上的空間,並把堆上空間的地址保存到棧上分配的小片空間中。
值類型的實例通常是在線程棧上分配的(靜態分配),但是在某些情形下可以存儲在堆中。
引用類型的對象總是在進程堆中分配(動態分配)。
裝箱和拆箱