dotnet學習筆記一 - 裝箱拆箱 (轉)

amyz發表於2007-11-16
dotnet學習筆記一 - 裝箱拆箱 (轉)[@more@]

轉眼作員已經四年了,自己也算是這一行的老人了。回頭看看,自己做過的東西不算少,從應用程式到核心,從普通程式到應用,從到。市面上流行的開發工具語言也都用過,VC,VB,,BCB,JBUILDER,,。不過捫心自問,那些是自己專長的呢?好像沒有,找工作的時候也是專案作了不少,算得上精通的,好像沒有。以前也接觸過,但是沒有深入,前一段時間由於一段機緣,對.NET產生了喜歡之情,好強大,也是很規整的OO語言。再加上自己對WIN平臺的多年的感情,決定投入到轟轟烈烈的.NET事業中去。書看過了需要消化和實踐,自己感覺把理解的東西寫出來是很好的一種消化方法,就萌生了把自己看得東西寫成一套學習筆記的想法。這篇是開篇,拋磚引玉,希望各位.NET界的師兄元老們多多指點,希望和和我一樣立志於學習應用.NET技術的朋友們一起討論,一起提高。

.NET算是集現有開發平臺語言之大成了,也提出了不少新概念。裝箱(boxing)和拆箱(unboxing)應該是一個了。

.NET的所有型別都是由基類System.繼承過來的,包括最常用的基礎型別:int, byte, short,bool等等,就是說所有的事物都是。但這樣造成了及底的,比如簡單的兩個數相加,bool取反都會導致從堆(Heap)中分配。怎樣解決這個問題呢?.NET把型別分成了兩類:值型和引用型。

值型在棧中分配記憶體,它們在宣告的同時就初始化,以確保資料不為NULL。例如:

byte b = 33;

上邊的宣告就在棧中分配了8位的記憶體,並將變數初始化為8。.NET的值型包括列舉(enum),結構(structure)和基本型別(int, float, short等)。值型不需要Garbage Collection來回收佔用的記憶體。超出了作用範圍後,會自動釋放。

引用型就完全類似於c++或者中的類了,在堆中分配記憶體,初始化為null。引用型是需要Garbage Collection來回收記憶體的。

既然值型也是從System.Object中繼承過來的,那麼這樣一句話就應該是合法的:

int n=3;

System.Object obj = n;

正如上面所說,n這個變數的記憶體應該是在棧中分配記憶體,而obj則應該在棧中分配記憶體。這時候系統都作了哪些工作呢?系統在堆中分配了一個物件obj,並將n的值複製給它。這就叫做裝箱(boxing。這時候n 和obj就是兩個沒有關聯的物件了,繼續執行如下的程式碼:

obj = 9;

Console.WriteLine( “{0}{1}”, n, obj );

得到的結果就是:

39

簡單的說裝箱就是隱式的將一個值型轉換為引用型物件。

和裝箱對應的就是拆箱了,拆箱(unboxing就是將一個引用型物件轉換成任意的值型。與裝箱不同,拆箱是顯示的操作。如下面的程式碼:

int i=0;

System.Object obj = i;

int j=(int)obj;

由此可見.NET的型別系統是統一的型別系統,因為不管是值型還是引用型都被看作物件,這樣就允許我們可以使用一致的方式跨程式碼處理型別。看一看下面的一段程式碼更能清楚地瞭解裝箱的好處:

ArrayList ar = new ArrayList();

Date dt = new Date();

ar.Add( dt );

:namespace prefix = o ns = "urn:schemas--com::office" />

int n = 10;

ar.Add( n );

正如最好兩行程式碼,我們不用顯示的分配一個System.Object,或者做強制的型別轉換。只要用我們最常用到的int就可以和其他的引用型物件一樣處理了。在最後一行程式碼中,當n加入到陣列中時,它已經被自動的裝箱了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982762/,如需轉載,請註明出處,否則將追究法律責任。

相關文章