【C#基礎】裝箱與拆箱
由於C#中所有資料型別都是基類System.Object繼承而來,所以值型別和引用型別的值可以通過顯示(或隱式)操作相互轉換,而這轉換的過程也就是裝箱(boxing)和拆箱(unboxing)的過程。
一、值型別:
值型別是在棧中分配記憶體。值型別的資料值儲存在記憶體的堆疊上,從記憶體的堆疊中可以快速訪問這些資料值。
值型別超出作用範圍,系統自動釋放記憶體。垃圾回收機制不參與回收。
將一個值型別變數的內容賦值給另一個值型別的變數時,變數值被拷貝。
主要由兩類組成:結構和列舉,結構分為以下幾類:
二、引用型別:
引用型別在堆中分配記憶體,初始化時預設為null。在棧中儲存指向堆中分配記憶體的地址,操作時通過棧中的指標尋找
引用型別通過垃圾回收裝置進行回收
將一個引用型別變數的內容賦值給另一個引用型別的變數內容時,只是變數的記憶體地址被拷貝。
三:拆箱和裝箱
裝箱(boxing):裝箱是把值型別轉換成引用型別或到此值型別所實現的任何介面型別的隱式轉換。
對值型別裝箱會在堆中分配一個物件例項,並將該值複製到新的物件中。
例項:
int i=123;
object o=i;
可以看的出第一條語句建立一個變數i並將值放在託管棧上
每次裝箱時,都要在堆中new出一個新的物件,佔用一定的內容,因此如果程式中頻繁的進行裝箱的操作的話,是會大大佔用記憶體,影響程式的效率的。
拆箱(unboxing):拆箱是把引用型別轉換成值型別或從介面型別到實現該介面的值型別的顯示轉換
總結:在實際應用中應該儘量避免拆裝箱的操作,因為頻繁的拆裝箱會大大影響程式的執行效率。
int i=10;
object obj=i;
int j=(int)obj;
四、小結
可以看出拆箱過程正好是裝箱過程的逆過程。裝箱和拆箱必須遵守型別相容原則。裝箱和拆箱使我們可以把一個值型別當作一個引用型別來看。裝箱轉換是指將 一個值型別隱式地轉換成一個object 型別。拆箱轉換是指將一個object 型別顯式地轉換成一個值型別它們互為逆過程。