C 裝箱 與 拆箱

2021-09-08 23:02:39 字數 1374 閱讀 7530

1、使用場景

裝箱的使用場景:想把值型別當做引用型別來使用,於是把值型別轉換為引用型別。

拆箱的使用場景:想把引用型別當做值型別來使用,於是把引用型別轉化為值型別。

再進一步,為什麼想把值型別當做引用型別來使用? 比如:方法定義時接受object 型別的引數,而你想傳遞int 型別,此時需要把int裝箱為object;對於一些非泛型的容器,為了保證通用,元素型別定義為object,此時向容器內新增int,double的時候,需要裝箱。

為什麼想把引用型別當做值型別來使用呢?對於值型別裝箱後的引用型別,你想直接使用值型別的資料。

2、實現原理

裝箱:(1)在堆上分配一塊記憶體,該記憶體就是乙個例項

(2)將值型別的資料複製到剛建立的例項中

(3)返回該例項的引用

拆箱:(1)取出例項中的資料

(2)賦值給新的變數

3、辨別是否進行了裝箱拆箱

拆箱是顯式的,而裝箱可以顯式也可以隱式,關鍵是判斷有沒有把值型別當做引用型別來使用。 

1

class program

2

22 }

4、盡量避免裝箱拆箱

為什麼?因為裝箱拆箱耗費時間和空間。

如何避免?

(1)對於方法定義接受的引數為object的情況,過載乙個方法,接受的引數為值型別。

(2)對於非泛型的容器,採用泛型容器代替。

5、如何修改已裝箱的值型別

舉例來說:

1

class program

2

11 }

12 13

struct mystruct

14

20 }

1、對於已經裝箱的obj,如果要修改內容,需要呼叫mystruct的方法,因此就要把obj轉化為struct,也就是拆箱。

2、拆箱後,會在棧上生成新的例項,呼叫方法不會影響obj。

也就是說,拆箱會在棧上產生新的例項,對棧例項的修改不會影響到原來的obj。

解決辦法:人為干涉,不讓obj進行拆箱操作。

讓mystruct實現介面imodify,在介面imodify中宣告modify方法,將obj 轉型為 介面,這時候並沒有進行拆箱,修改會產生***。如下:

1

class program

2

11 }

12 13

struct mystruct:imodify

14

20 }

21 22

public

inte***ce imodify

23

C 裝箱與拆箱

要掌握裝箱與拆箱,就必須了解cts及它的特點。net重要技術和基礎之一的cts common type system 顧名思義,cts就是為了實現在應用程式宣告和使用這些型別時必須遵循的規則而存在的通用型別系統。net將整個系統的型別分成兩大類 value type 和 reference type...

C 裝箱與拆箱

裝箱是將 值型別轉換為 引用型別 拆箱是將 引用型別 轉換為值型別 利用裝箱和拆箱功能,可通過允許 值型別的任何值與 object 型別 的值相互轉換,將值型別與引用型別鏈結起來 例如 int val 100 object obj val console.writeline 物件的值 obj 這是乙...

C 裝箱與拆箱

在前面提到了值型別和引用型別。這裡就來和大家一起了解一下,他們互相轉換的過程裝箱 boxing 拆箱 unboxing 由於c 中所有的資料型別都是由基類system.object繼承而來的,所以值型別和引用型別的值可以通過顯式 或隱式 操作相互轉換,而這轉換過程也就是裝箱 boxing 和拆箱 u...