dotnet學習筆記一 - 裝箱拆箱 (轉)
轉眼作員已經四年了,自己也算是這一行的老人了。回頭看看,自己做過的東西不算少,從應用程式到核心,從普通程式到應用,從到。市面上流行的開發工具語言也都用過,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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java 效能筆記:自動裝箱/拆箱Java筆記
- java裝箱拆箱Java
- C#之拆箱,裝箱C#
- Java自動拆箱與裝箱Java
- c#的裝箱和拆箱C#
- Java學習之自動裝箱和自動拆箱原始碼分析Java原始碼
- Java的自動裝箱和拆箱Java
- 談談JavaScript中裝箱和拆箱JavaScript
- 資料型別及拆箱裝箱資料型別
- Visual C#裝箱與拆箱C#
- 深入淺出瞭解“裝箱與拆箱”
- 深入理解Java之裝箱與拆箱Java
- Java中的自動裝箱與拆箱Java
- 深入剖析Java中的裝箱和拆箱Java
- Java自動裝箱/拆箱 - Java那些事兒Java
- 深入理解C#的裝箱和拆箱C#
- [JAVA] Java物件導向之包裝類,拆箱、裝箱Java物件
- Java中的自動裝箱與自動拆箱Java
- Effective C#:儘量減少裝箱和拆箱C#
- java空指標出現的情況:拆箱裝箱Java指標
- 如何理解Java中的自動拆箱和自動裝箱?Java
- 通過原始碼瞭解Java的自動裝箱拆箱原始碼Java
- 【java】JDK5的新特性→→自動裝箱和拆箱JavaJDK
- Java語法糖2:自動裝箱和自動拆箱Java
- .NET Core CSharp 中級篇 2-1 裝箱與拆箱CSharp
- 基礎鞏固、探尋Java裝箱和拆箱的奧妙!Java
- Java 效能要點:自動裝箱/ 拆箱 (Autoboxing / Unboxing)Java
- Integer 自動拆箱封箱
- 【轉】.NET中的六個重要概念:棧、堆、值型別、引用型別、裝箱和拆箱型別
- seaborn學習筆記(四):箱型圖、小提琴圖筆記
- java中的內部類和自動拆裝箱Java
- 原來 JS 還存在這樣的拆箱轉換JS
- .NET中的六個重要概念:棧、堆、值型別、引用型別、裝箱和拆箱型別
- c#之裝箱和取消裝箱C#
- 一文讀懂什麼是Java中的自動拆裝箱Java
- 記一次Java自動拆箱引發的空指標問題Java指標
- java基礎(八) 深入解析常量池與裝拆箱機制Java
- 【JS迷你書】基本型別之拆箱操作JS型別