C#核心概念--裝箱和拆箱(什麼是裝箱和拆箱)

箱(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

  {

   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);

}

}

輸出結果:1010             

就相當於指針,兩個變量指向同一塊內存數據,當一個變量對內存區數據改變之後,另一個變量指向的數據當然也會改變。

原文出處:http://www.cnblogs.com/xiaoshi/archive/2008/05/28/1208902.html

發佈了60 篇原創文章 · 獲贊 8 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章