服務熱線
153 8323 9821
裝 箱(boxing )和拆箱(unboxing )是C#類型系統(tǒng)的核心概念.是不同于C與C++的新概念!,通過裝箱和拆箱操作,能夠在值類型和引用類型中架起一做橋梁.換言之,可以輕松的實現(xiàn)值類型與引用類型的互相轉(zhuǎn)換,裝箱和拆箱能夠統(tǒng)一考察系統(tǒng),任何類型的值最終都可以按照對象進行處理.
C#語言中的所有類型都是由基類System.Object繼承過來的,包括最常用的基礎(chǔ)類型:int, byte, short,bool等等,就是說所有的事物都是對象。如果申明這些類型得時候都在堆(HEAP)中分配內(nèi)存,會造成極低的效率!(個中原因以及關(guān)于堆和棧得區(qū)別會在另一篇里單獨得說說!)
.NET如何解決這個問題得了?正是通過將類型分成值型(value )和引用型(regerencetype ),C#中定義的值類型包括原類型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、 Float、Double、Bool、Decimal )、枚舉(enum )、結(jié)構(gòu)(struct ),引用類型包括:類、數(shù)組、接口、委托、字符串等。
值型就是在棧中分配內(nèi)存,在申明的同時就初始化,以確保數(shù)據(jù)不為NULL;
引用型是在堆中分配內(nèi)存,初始化為null,引用型是需要GARBAGE COLLECTION來回收內(nèi)存的,值型不用,超出了作用范圍,系統(tǒng)就會自動釋放!
下面就來說裝箱和拆箱的定義!
裝箱就是隱式的將一個值型轉(zhuǎn)換為引用型對象。比如:
int i=0;
Syste.Object obj=i;
這個過程就是裝箱!就是將i裝箱!
拆箱就是將一個引用型對象轉(zhuǎn)換成任意值型!比如:
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);
其中共發(fā)生了3次裝箱和一次拆箱!^_^,看出來了吧?!
第一次是將i裝箱,第2次是輸出的時候?qū)轉(zhuǎn)換成string 類型,而string 類型為引用類型,即又是裝箱,第三次裝箱就是(int)obj 的轉(zhuǎn)換成string 類型,裝箱!
拆箱就是(int)obj ,將obj 拆箱?。?/p>
在 C# 中,將類和數(shù)組等都歸為了引用型的,那么值類型和引用型有什么區(qū)別呢?
值類型的變量包含自身的數(shù)據(jù),而引用類型的變量是指向數(shù)據(jù)的內(nèi)存塊的,并不是直接存放數(shù)據(jù)。對于值類型,每個變量都有一份自己的數(shù)據(jù)復制,對另一個值類型變量的操作并不影響這一個變量的值。
而對于引用類型,兩個變量有可能引用同一對象,因此對一個變量的操作會影響到另一個變量。
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
{
public int value=0;
}
class text{
public static void main()
{
valueclass a=new valueclass()
valueclass a=b;
b.value=10;
Console.WriteLine(“{0},{1}”,a.value,b.value);
}
}
輸出結(jié)果: 10 , 10
就相當于指針,兩個變量指向同一塊內(nèi)存數(shù)據(jù),當一個變量對內(nèi)存區(qū)數(shù)據(jù)改變之后,另一個變量指向的數(shù)據(jù)當然也會改變。