CSharp學習筆記之一 C#中的類型

       在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就不可以)。需要注意的是,值類型中的結構體也是可以實現接口的。


內存分配

說起值類型和引用類型的不同,內存分配可謂是它們的本質區別了,這也可以讓我們更加清晰的瞭解一些生活中遇到的問題。

值類型的實例一般都會存放在棧上,之所以說是一般,是因爲它有時候也會去引用類型那裏竄門,會有特殊情況,存放在堆上,接下來會講。與之不同的是,引用類型的對象則總是存儲在堆中,當然它的引用有時候也會存放在棧上,但是對象實例是一定存放在堆上的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章