裝箱和拆箱的理解

2021-05-24 03:01:04 字數 1650 閱讀 2329

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

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=10;       

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

引用型別:

using system;

class valueclass

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

}輸出結果:10,10

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

裝箱和拆箱 深度理解

提問 首先我們來提兩個疑問,我們自定義了乙個類如customclass型別,customclass myclass new customclass object obj myclass 執行上面這段 我們會進行裝箱操作嗎?基礎知識 net的型別分為兩種,一種是值型別 value type 另一種是引...

裝箱和拆箱,自動裝箱和自動拆箱

以integer的建立為例。裝箱 把基本資料型別轉換成包裝類物件 int integer integer num1 new integer 17 拆箱 把乙個包裝類的物件,轉換成基本型別的變數 integer int int num2 num1.intvalue 自動裝箱 integer num3 ...

C 裝箱 拆箱 理解

裝箱和拆箱是值型別和引用型別之間相互轉換是要執行的操作。1.裝箱在值型別向引用型別轉換時發生 2.拆箱在引用型別向值型別轉換時發生 光上述兩句話不難理解,但是往深處了解,就需要一些篇幅來解釋了。我們先看裝箱時都會發生什麼事情,下面是一行最簡單的裝箱 objectobj 1 這行語句將整型常量1賦給o...