在C#中,有且僅有兩種數據類型:值類型和引用類型。換言之,一個變量要麼是值類型,要麼是引用類型。像我們常見的數據類型(int,float,double)、結構、枚舉等等都屬於值類型,而像類、接口、委託等都屬於引用類型。所以,要想深入的瞭解.net framework的一些原理性的知識,值類型與引用類型是跨不過去的一道門檻。
下面是一個關於C#中的類型的總結圖片
但是C#中的基本類型的定義是源於什麼呢:
C#中變量的類型取決於什麼?
在C#中,變量是值類型還是引用類型,取決於其基本數據類型。在C#中,其基本數據類型並沒有內置於語言中,而是存在與.Net Framewok中。.Net使用CTS(通用語言系統)定義在IL(中間語言)中使用的預定義數據類型。C#中所有數據類型都是對象,它們有屬性、方法等。
例如,在C#中聲明一個int變量時,實際上是聲明瞭CTS中System.Int32的一個實例。
值類型
前面已經說過,值類型隱式派生於System.ValueType,那麼在平時遇到的數據類型中,有哪些屬於值類型呢?
整型。包括我們常見的short、int、long、byte、sbyte、bigint等這。
浮點型。包括float、double。
用於財務計算的高精度decimal類型。
結構體。struct,已經預定好的和用戶自定義的。
枚舉。
bool類型。
可空類型。
每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值,這也是爲什麼像定義一個int型的變量時,有時候沒有初始化,它也會有初始值爲0的緣故。
還有一點需要注意的是,所有值類型都是seal(密封)類型,是不能再派生出新的數據類型的。
引用類型
在C#中,有以下這些引用類型:
數組。
類。
接口。
委託。
object。其實就是System.Object,老大哥。
字符串。string,System.String的別名,這也是一個極其重要的引用類型,後面會有專門一篇來描述字符串中的點點滴滴。
與值類型不同的是,引用類型可以派生出新的類型(不絕對話,比如說string就不可以)。需要注意的是,值類型中的結構體也是可以實現接口的。
內存分配
說起值類型和引用類型的不同,內存分配可謂是它們的本質區別了,這也可以讓我們更加清晰的瞭解一些生活中遇到的問題。
值類型的實例一般都會存放在棧上,之所以說是一般,是因爲它有時候也會去引用類型那裏竄門,會有特殊情況,存放在堆上,接下來會講。與之不同的是,引用類型的對象則總是存儲在堆中,當然它的引用有時候也會存放在棧上,但是對象實例是一定存放在堆上的。