C#類型主要分為兩類:實值型別和參考型別。C#主要類型如下:
類別 |
描述 |
實值型別 |
簡單類型 |
有符號整形:sbyte,short,int,long |
無符號整形:byte,ushort,uint,ulong |
Unicode字元:char |
IEEE浮點型:float,double |
高精度小數:decimal |
布爾型:bool |
枚舉類型 |
使用者自訂類型:enum |
結構類型 |
使用者自訂類型:struct |
參考型別 |
類類型 |
所有其他類型基類:object |
Unicode字串:string |
使用者自訂類型:class |
介面類型 |
使用者自訂類型:interface |
數群組類型 |
單維多維陣列:int[],int[,] |
委託類型 |
使用者自訂類型:delegate |
C#實值型別和參考型別的區別:
1、定義:實值型別(Value Type)執行個體通常分配線上程的堆棧(stack)上,不包含任何指向執行個體資料的指標,變數本身就包含了執行個體資料。實值型別的執行個體要麼在堆棧上,要麼內聯在結構上。實值型別包括:簡單類型,結構體類型和枚舉類型。
參考型別(Reference Type)執行個體分配在託管堆(managed heap)上,變數儲存了執行個體資料的記憶體引用。參考型別儲存對值的記憶體位址的引用,位於堆上。參考型別包括:類類型,數組,委託類型和介面類型。
2、記憶體概況:實值型別分配在堆棧上,每執行個體一個實值型別則在堆棧上分配一個記憶體位址,不同的變數佔用了不同的堆棧地址,改變一個變數不會影響其他變數。
參考型別在堆棧中只是儲存了其執行個體資料的引用地址,實際的資料儲存在託管堆中,所以可能不同的變數儲存了同一地址的資料引用,改變一個變數會影響另一個變數的值。
3、嵌套結構:參考型別嵌套實值型別時,作為參考型別執行個體的一部分也會被分配到託管堆上。
實值型別嵌套參考型別時,參考型別作為實值型別的成員變數,堆棧上儲存該成員的引用,而成員的實際資料還是儲存在託管堆上。即實值型別執行個體總是分配在它聲明的地方,聲明為局部變數時記憶體被分配在堆棧上,聲明為參考型別成員變數時記憶體被分配到託管堆上;參考型別總是分配在託管堆上。
4、實值型別繼承自ValueType,參考型別繼承於object。
5、實值型別的記憶體不由GC控制,範圍結束時,實值型別會自動釋放,減少託管堆的壓力,具有效能優勢。而參考型別的記憶體配置與回收都由GC來完成。
6、實值型別時密封的,不能作為基類,但可以單繼承或者多繼承介面。參考型別一般可以繼承。
7、實值型別不具有多態,參考型別具有多態。
8、實值型別不能為null,會自動初始化為0;參考型別預設初始化為null,表示沒有指向任何託管堆的引用地址。
9、實值型別由2種狀態:裝箱和未裝箱;參考型別只有一種形式:裝箱。