C#所有的型別可區分為兩種。簡單介紹如下
Value Type
實值型別。顧名思義儲存的是實體的值,也就是記憶體位址。每個實體型別宣告的變數各對應一組記憶體位址,記憶體位址存放該變數的值。
Value Type包含兩大類
- 結構(struct)
數值型別:整數型別(byte,char,int,….)、浮點類型(double,float)、decimal(精度類型)
布林
使用者自訂(宣告為struct 的自訂類別)
*詳可見MSDN - 列舉(enum)
各種自定義的列舉
*詳可見MSDN
Reference Type
參考型別。顧名思義儲存的是一個參考位址而非實體的值。所以會有兩個變數同時對應到同一個實體位址,而導致互相修改與影響的情形。
內建的參考型別有
- dynamic
- object
- string (*string是特殊的參考型別,原型是char[]。C#中可以直接將其視為實值型別)
另可以關鍵字 class、interface、delegate進行宣告
以下是簡單的範例
重點小記
- 實體型別每次異動都會配置一個新的記憶體位址(所以盡量不要跑迴圈組大型字串,請愛用StringBuilder)
- 參考型別創建時配置的是參考位址,複製(=、Clone)時複製的是參考位址非實際物件內容(但是裡面的實體型別可以複製下來),要完整複製須使用物件序列化再反序列化
- 實體型別的記憶體配置與回收由系統自行處理
- 參考型別的記憶體回收需自行控制(C#有自主回收機制)
補充
Pointer Type *
指標型別。C#預設為不開啟。只有在unsafe模式中可以使用。主要在處理實體型別會自動配置記憶體的問題。只有實體型別可以設為指標型別。一般用不太到MSDN說明