自學C 之路7 裝箱和拆箱

2021-09-01 11:22:28 字數 1683 閱讀 4917

c#中的變數分為值型別和引用型別兩種。值型別變數儲存在棧上,比較簡單;引用型變數儲存在堆上,比較複雜。

int n = 123; 

object obj = n; //裝箱

string s = obj.tostring();

這裡 c#在暗中進行了魔術轉換——裝箱(boxing)。裝箱操作能把值型別資料打包到引用型變數中,使我們能夠像使用物件一樣使用值型別變數。 系統先建立引用型變數obj,在堆中為 obj 分配空間,並存入 n 的值,這樣 n 就被裝入引用型資料obj 中了。

對於裝入箱中的資料,可以通過拆箱(unboxing)操作釋放出來,拆箱操作要用顯式 轉換。

int i = (int)obj; //拆箱

咋一看很不理解c#這個東西為什麼值得拿出來說,上面的裝箱**可以寫成

//c# 

int n = 123;

int m = new int[1];

m[0] = n;//這樣是不是也可以理解為是裝箱

string s = m[0].tostring();

//c++

int n = 123;

int* m = new int[1];

m[0] = n;//這樣是不是也可以理解為是裝箱

//...

delete m;

拆箱**

//c# 

int i = m[0];

//c++

int i = m[0];

這不就是個給堆上分配空間賦值的過程嗎?obj的引用不就相當於指標嗎?這到底有啥好單獨拿出來講的?

but,當乙個方法的引數型別不能確定時,裝箱操作就非常有用。假設我們有乙個倉庫storehouse,用 來儲存各種各樣的物品

public object items; 

private int count;

//方法:向倉庫裡新增貨物

public void add(object obj)

else

} storehouse store = new storehouse(5);

//向倉庫裡新增貨物

store.add(100);

store.add(3.14);

store.add("good");

store.add(new bird());

store.add(new cat());

簡直屌炸有沒有。比c++泛型程式設計的實現可簡單多了;

c 裝箱和拆箱

c 裝箱和拆箱 概念 裝箱 將值型別轉換為引用型別的過程叫做裝箱 值型別 引用型別 相反,拆箱 將引用型別轉換為值型別 叫做拆箱 引用型別 值型別 裝箱例子 int i 2008 object obj i console.writeline 1 i的值為,裝箱之後的值 i,obj i 927 con...

C 裝箱和拆箱

1 什麼是裝箱和拆箱 裝箱是將值型別轉換為引用型別 拆箱是將引用型別轉換為值型別 2 什麼時候需要裝箱?值型別是高效輕量的型別,因為預設情況下在堆上不包括他們的物件元件,然而,如果我們需要物件元件,這個時候就需要裝箱了。最常見的場景就是 乙個方法你希望能共用,設定的引數型別是object型別 引用型...

C 裝箱和拆箱

值型別例項進行裝箱時的步驟 1 在託管堆中分配記憶體。需要注意的是,由於是將值型別進行引用型別化,因而分配的記憶體空間除了值型別各個欄位所需的記憶體之外,還要加上託管堆所有物件都有的兩個額外成員 型別物件指標和同步塊索引 所需的記憶體。2 將值型別的字段複製到新分配的堆記憶體中。3 返回物件位址,即...