什麼是裝箱和拆箱?怎樣操作?

2021-06-16 10:08:26 字數 1877 閱讀 9988

從值型別介面轉換到引用型別裝箱。

從引用型別轉換到值型別拆箱。

通過裝箱拆箱操作,能夠在值型別和引用型別中架起一做橋梁.換言之,可以輕鬆的實現值型別與引用型別的互相轉換,裝箱和拆箱能夠統一考察系統,任何型別的值最終都可以按照物件進行處理.

c#語言中的所有型別都是由基類system.object繼承過來的,包括最常用的基礎型別:int, byte, short,bool等等,就是說所有的事物都是物件。如果申明這些型別得時候都在堆(heap)中分配記憶體,會造成極低的效率!(個中原因以及關於堆和棧得區別會在另一篇裡單獨得說說!)

.net如何解決這個問題得了?正是通過將型別分成值型(value )和引用型(regerencetype ),c#中定義的值型別包括原型別(sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、bool、decimal )、列舉(enum )、結構(struct ),引用型別包括:類、陣列、介面委託字串等。

值型就是在棧中分配記憶體,在申明的同時就初始化,以確保資料不為null;

引用型是在堆中分配記憶體,初始化為null,引用型是需要garbage collection來**記憶體的,值型不用,超出了作用範圍,系統就會自動釋放!

下面就來說裝箱和拆箱的定義!

裝箱就是隱式的將乙個值型轉換為引用型物件 。比如:

int i=0;

syste.object obj=i;

這個過程就是裝箱!就是將i裝箱!

拆箱就是將乙個引用型物件轉換成任意值型 !比如:

int i=0;

system.object obj=i;

int j=(int)obj; 

這個過程前2句是將i裝箱,後一句是將obj拆箱!

再寫個**,看看進行了幾次裝拆箱!

int i=0;

system.object obj=i;

console.writeline(i+","+(int)obj); 

其中共發生了3次裝箱和一次拆箱!看出來了麼?!

第一次是將i裝箱,第2次是輸出的時候將i轉換成string 型別,而string 型別為引用型別,即又是裝箱,第三次裝箱就是(int)obj 的轉換成string 型別,裝箱

拆箱就是(int)obj ,將obj 拆箱!!

在 c# 中,將類和陣列等都歸為了引用型的,那麼值型別和引用型有什麼區別呢?

值型別的變數包含自身的資料,而引用型別的變數是指向資料的記憶體塊的,並不是直接存放資料。對於值型別,每個變數都有乙份自己的資料複製,對另乙個值型別變數的操作並不影響這乙個變數的值。

而對於引用型別,兩個變數有可能引用同一物件,因此對乙個變數的操作會影響到另乙個變數。

eg: 值型別

(1) int  a=0; 

(2) int  b=a;

(3) int  b=5;  

( 2 )之後, a,b 均為 0 ,但是( 3 )之後, b=5, a=0; 對 b 的重新附值並不影響 a

引用型別:

using system;

class valueclass

class text,」,a.value,b.value);}}

輸出結果: 5 , 5 

就相當於指標,兩個變數指向同一塊記憶體資料,當乙個變數對記憶體區資料改變之後,另乙個變數指向的資料當然也會改變。

html

什麼是裝箱,拆箱?怎樣操作?

從值型別介面轉換到引用型別裝箱。從引用型別轉換到值型別拆箱。通過裝箱和拆箱操作,能夠在值型別和引用型別中架起一做橋梁.換言之,可以輕鬆的實現值型別與引用型別的互相轉換,裝箱和拆箱能夠統一考察系統,任何型別的值最終都可以按照物件進行處理.c 語言中的所有型別都是由基類system.object繼承過來...

什麼是裝箱和拆箱

裝箱 boxing 和拆箱 unboxing 是.net提出得新概念!net的所有型別都是由基類system.object繼承過來的,包括最常用的基礎型別 int,byte,short,bool等等,就是說所有的事物都是物件。如果申明這些型別得時候都在堆 heap 中分配記憶體,會造成極低的效率!個...

C 核心概念 裝箱和拆箱 什麼是裝箱和拆箱

裝箱 boxing 和拆箱 unboxing 是c 型別系統的核心概念.是不同於c與c 的新概念!通過裝箱和拆箱操作,能夠在值型別和引用型別中架起一做橋梁.換言之,可以輕鬆的實現值型別與引用型別的互相轉換,裝箱和拆箱能夠統一考察系統,任何型別的值最終都可以按照物件進行處理.c 語言中的所有型別都是由...