c# 裝箱與拆箱

來源:互聯網
上載者:User

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

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

byte b = 33;

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

引用型就完全類似於c++或者java中的類了,在堆中分配記憶體,初始化為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 );

 

int n = 10;

ar.Add( n );

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

                                                                                                                         轉自:http://www.upschool.com.cn/edu/1317/2005/528/10du246613_1.shtml

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.