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

C#指南筆記。編程

1、CTS定義了一個類型庫,不管時Visual Basic.NET仍是c#,他們的類型系統大致相似。所以.NET將各類不一樣的編程語言的數據類型進行抽象,就有了CTS。雖然每種編程語言都有本身的類型系統,但編譯後都會轉成CTS類型。不一樣的語言編寫的程序直間能夠相互操做。Vb的integer而C#的System.Int32都對應CTS的System.Int32類型。c#

CTS類型主要分紅兩大類:引用類型和值類型,這兩個類型能夠相互轉換,方法是裝箱和拆箱。編程語言

clip_image002

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

2、 值類型和引用類型。對象

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

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

clip_image003

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

兩者的區別:內存

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

char userInput= 'c';

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

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

string name = "Hello World";

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

3、 裝箱和拆箱

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

CLR會如今託管堆配置一塊內存,將值類型的數據複製到這塊內存,而後再讓託管棧上的引用類型變量指向這塊內存。反之爲拆箱。

通常裝箱是自動的,系統會幫咱們完成,但拆箱並不是自動的,咱們必須知道被拆箱的對象的實際類型,而後明確地去執行拆箱操做。

clip_image004

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

示例代碼:

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

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

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

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

相關文章
相關標籤/搜索