通用類型系統(Common Type System CTS)


C#權威指南筆記。

一、CTS定義了一個類型庫,無論時Visual Basic.NET還是c#,他們的類型系統大體類似。因此.NET將各種不同的編程語言的數據類型進行抽象,就有了CTS。雖然每種編程語言都有自己的類型系統,但編譯后都會轉成CTS類型。不同的語言編寫的程序直間可以相互操作。Vb的integer而C#的System.Int32都對應CTS的System.Int32類型。

CTS類型主要分成兩大類:引用類型和值類型,這兩個類型可以相互轉換,方法是裝箱和拆箱。

clip_image002

有圖的可知,引用類型直接繼承自Object對象,值類型繼承自ValueType對象,而ValueType繼承自Object對象。所以CTS類型最終繼承自Object。

二、 值類型和引用類型。

值類型的變量直接存儲數據,而引用類型的變量持有的是數據的引用,數據存儲在堆中。

對於引用類型而言,由於數據存儲在堆中,指向它的引用不止一個,因此當其它引用對數據進行修改時會影響到別的引用。

clip_image003

在托管代碼中,每種類型有兩種分配內存的方式,分配在托管棧中,分配在托管堆中。

二者的區別:

1. 分配在托管棧中的變量會在創建它們的方法返回時自動釋放。

char userInput= 'c';

在一個方法內聲明Char類型的變量userInput它的值為‘c’當實例化它的方法結束時,userInput變量在棧上占有的內存就會自動釋放。

2. 分配在托管堆中的變量並不會再創建它們的方法結束時釋放內存。所占用的內存會被CLR中的垃圾回收機制釋放。

string name = "Hello World";

聲明一個String類型的變量name,它指向托管堆中的數據“Hello World“,當方法調用結束的時候,name在托管堆上所占用的內存會立即釋放,但他在托管堆上的數據還依然存在。只不過此時可能沒有變量的引用指向它了。它將持續等待直到未來時候被GC回收並釋放所占內存。

三、 裝箱和拆箱

當值類型的數據轉換為引用類型時為裝箱,反之為拆箱。

CLR會現在托管堆配置一塊內存,將值類型的數據復制到這塊內存,然后再讓托管棧上的引用類型變量指向這塊內存。反之為拆箱。

一般裝箱是自動的,系統會幫我們完成,但拆箱並非自動的,我們必須知道被拆箱的對象的實際類型,然后明確地去執行拆箱操作。

clip_image004

托管棧中的類型為Int32值為1023的變量,裝箱后引用類型變量位於棧中,原來值類型變量的值被放入托管堆中的一個對象中,其內容為1023,類型為Object,然后將位於托管棧中的引用類型變量指向堆中這個Object類型的變量,這就是裝箱的整個過程。

示例代碼:

Int32 number = 1023;//Int32類型的變量number

object boxingNumber = number;//系統自帶裝箱

Int32 unboxingNumber = (Int32)boxingNumber;//明確的拆箱

注意:裝箱和拆箱堆性能是有影響的,因此它話費了更多的時間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM