《CLR via C#》讀書筆記---07 常量和字段

核心歸納
這裏寫圖片描述


常量:代碼文件中的數據字段

① 常量是個佔位符,不佔用內存。
想象:有兩段代碼用同一個常量A(A=5)的情況
編輯:——-A——–A———(線假設爲方法)
編譯:——-5——–5———
編譯和運行的時候,已經沒有常量,沒有A的概念,被常量的值所替代。那這樣A的值就一直存在於代碼文件中,存在於硬盤中。

② 因爲一直存在,所以static的,又因爲即使程序沒有運行這個常量的值仍存在,這比static還static;但根據編譯器的習慣,不能主動添加static修飾(接口中成員是public的,但不允許主動添加)


常量本質驗證

因爲是存在硬盤中,不需要動態分配內存,所以可以將純常量的dll刪除也不影響程序的正常
做下面一個實驗:

這裏寫圖片描述

刪除程序集:No.7-ConstString.dll

這裏寫圖片描述

刪除程序集:No.7-NormalString.dll

這裏寫圖片描述

字段

① volatile修飾符

編譯器會優化內碼,運行時會出現從緩存取數據的情況。在多線程的情況下,這樣會造成取到的數據不是真實的,volatile修飾是禁止編譯器優化這一點,從內存中取

② readonly修飾符

readonly是個僞君子。說只能在構造中賦值;但反射也可以賦值,如果有什麼辦法可以再次侵入構造,那也可以賦值了
readonly是個僞君子。說賦值後只能read,但是引用類型引用的對象無此限制

readonly也是C#翻譯過來的關鍵字,個人感覺CLR中的InitOnly更貼切


發佈了206 篇原創文章 · 獲贊 123 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章