1. 程式人生 > >c#的裝箱和拆箱及值類型和引用類型

c#的裝箱和拆箱及值類型和引用類型

int 什麽 容易 將在 shc 表達 需要 code 引用

裝箱:它允許根據值類型創建一個對象,然後使用對這新對象的一個引用。

int i = 5;

object o = i;

int j = (int)o;

裝箱:運行時將在堆上創建一個包含值5的對象(它是一個普通對象)。o的值是對該對象的一個引用。該對象的值是原始值的一個副本,改變 i 的值不會改變箱內的值。

拆箱:第三行,必須告訴編譯器將object拆箱成什麽類型,同樣,拆箱也會復制箱內的值,在賦值之後,j和該對象之間不再有任何關系。

拆箱和裝箱的發生是時間:拆箱一般是很容易看出來,因為要在代碼中明確的顯示一個強制類型轉換,裝箱可能悄悄進行,為一個類型的值調用ToString,Equals或HashCode方法時,如果該類型沒有覆蓋這些方法,也會發生裝箱,另外,將值作為接口表達式使用時---把它賦給一個接口類型的變量,或者把它作為接口類型的參數來傳遞---也會發生裝箱,之所以要留意裝箱和拆箱,是由於他們可能會降低性能。

引用類型的對象總是在堆上,值類型的值既可能在棧上,也可能在堆上。引用類型作為方法參數使用時,參數默認是以“值傳遞”方式來傳遞的——但值本身是一個引用。值類型的值會在需要引用類型的行為時被裝箱;拆箱則是相反的過程。

c#的裝箱和拆箱及值類型和引用類型