瞭解.NET的類型很重要
.NET的主要類型分為實值型別和參考型別
區分這2種類型
1、記憶體方面
實值型別:
包括枚舉enum 和結構 struct
記憶體配置:
執行個體通常分配線上程的堆棧上,並且不包括任何指向執行個體資料的指標,因為變數本身就包含了其執行個體資料,記憶體不由GC來控制,範圍結束時,實值型別會自行釋放
參考型別:
包括類,介面,數組,委託
記憶體配置:
執行個體分配在託管堆上,儲存了執行個體資料的記憶體引用,由GC(Garbage Collection)來控制其回收
特殊情況:
出現嵌套的時候,即實值型別嵌套參考型別,參考型別嵌套實值型別,那麼記憶體又是如何分配的呢?
實值型別執行個體總是分配在他聲明的地方,參考型別執行個體總是分配在託管堆上
2、sizeof()運算子用於擷取實值型別的大小,但是不適用於參考型別
3、實值型別使用new操作符或者賦初值完成初始化,而單純的定義沒有完成初始化,此時對成員的引用將不能通過編譯
4、參考型別在效能上欠於實值型別
5、實值型別繼承自System.ValueType ,而System.ValueType 又繼承自 System.Object
6、實值型別是密閉的,不能作為其他類型的基類,但是可以單繼承或者多繼承介面,而參考型別一般有繼承性
7、實值型別沒有多態,但是參考型別有多態
實值型別和參考型別的互相轉換
裝箱和拆箱
按值傳遞和按引用傳遞:
按值傳遞
不管是參考型別按值傳遞還是實值型別按值傳遞,都是在堆棧上複製一個對象的執行個體,將這個新的執行個體去傳遞,不改變原有執行個體的值。
按引用傳遞
是直接將指向執行個體的引用地址進行傳遞,改變了地址,則會改變參數的值
傳遞的是參數的地址
實值型別按引用傳遞時實現的是對實值型別參數執行個體的直接操作
Ref和Out均為引用傳遞,區別 是Ref參數傳遞前該參數必須已經被初始化,而out參數傳遞不需要
使用者自訂類型轉換的實現方式:
Static 訪問修飾操作符 轉換修飾操作符 operator 類型 (參數列表)
所有的轉換都必須是static 見P160
如果聲明了一個類對象指向一個託管堆地址,但是該類對象改變了引用,那麼之前的地址會被GC回收
裝箱和拆箱
裝箱
將實值型別資料轉換成無類型的引用對象
過程:
1、 記憶體配置
2、 執行個體拷貝
3、 地址返回(不包含這步,但是常常伴隨著一起發生)
拆箱
擷取已裝箱對象中來自實值型別部分欄位的地址,在執行上不包括欄位的拷貝過程
過程:
1、 執行個體檢查
2、 指標返回
3、 欄位拷貝
遵循的規範:
1、 拆箱後必須保證執行後的結果是原來未裝箱時的類型
2、 參考型別一直保持著裝箱狀態,裝箱和拆箱是針對實值型別而言的
應該盡量避免裝箱拆箱的發生,可以考慮使用泛型
ArrayList,HashTable,Emun均易引起裝箱