1. 程式人生 > >CSharp學習筆記之一 C#中的型別

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


記憶體分配

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

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