《C#本質論》讀書筆記<四>值型別再解析

酒館筆記發表於2020-10-10
不要建立消耗記憶體大於16位元組的值型別

值型別在佔用記憶體比較小時,效能比較快, 記憶體比較大(16位元組)時,反而不一定效能好
在這裡插入圖片描述

值型別與引用型別記憶體分佈示意圖

值型別在棧中,用完即可回收。
引用型別在棧中有個引用,引用的大小與處理器的位數一致。該引用指向堆中具體的記憶體塊。
在這裡插入圖片描述

要建立不變得值型別

在這裡插入圖片描述

結構體Struct

結構體與類的比較
結構體的欄位需要全部直接初始化(復看不太理解,挖個坑)

結構體的欄位不許有預設值,因為初始化時會賦予型別對應預設值。
在這裡插入圖片描述

在所有的欄位初始化完之前,訪問this是非法的
new值型別與new引用型別的區別

在這裡插入圖片描述

裝箱和拆箱

裝箱和拆箱都需要拷貝(儘量避免)

裝箱是記憶體申請和記憶體拷貝
拆箱是記憶體檢查和記憶體拷貝
在這裡插入圖片描述

拆箱(unbox)的內部過程:

(1)因為一個物件將被轉換,所以編譯器必須先判斷堆疊上指向合法物件的地址,以及這個物件型別是否可以轉換為MSL unbox指令呼叫中指定的值型別。如果檢查失敗就丟擲InvalidCastException異常。
(2)校驗通過後,就返回指向物件內的值的指標。可以看出,裝箱操作會建立轉換型別的副本,而拆箱就不會。不過注意一下,在我們裝箱的時候是先把變數i的值複製了一份賦給ob的,所變數j拿到的是ob這個變數的引用。也就是後面再改變i的值並不會影響j的值,但是改變ob的值就會。

拆箱時要求必須要拆為原來裝箱時的型別

哪怕拆為可以隱式轉型的型別,也無法編譯通過;
(例如int裝箱成的Object無法直接拆為double,儘管int可以隱式轉為double)

列舉

列舉和字串的互轉
  • 列舉可以直接ToString轉為字串
    在這裡插入圖片描述

  • 字元轉為列舉需要Enum.Parse在這裡插入圖片描述

相關文章