常量 常量總是被視為靜態成員。 常量其實可以不限於基元類型,但是必須初始化為null。(我覺得這個點知道和不知道都一樣,我已經自動從腦海中忽略了。很多時候在我這個人眼中,艱澀的代碼和垃圾代碼,其實沒有任何區別。很討厭明明有更簡單易懂的解決方案,非要去炫一些生僻無用的技術的程式員,總是喜歡用這種方式讓
常量
常量總是被視為靜態成員。
常量其實可以不限於基元類型,但是必須初始化為null。(我覺得這個點知道和不知道都一樣,我已經自動從腦海中忽略了。很多時候在我這個人眼中,艱澀的代碼和垃圾代碼,其實沒有任何區別。很討厭明明有更簡單易懂的解決方案,非要去炫一些生僻無用的技術的程式員,總是喜歡用這種方式讓哥哥我不能按時下班)
而且編譯的時候會直接提取常量的值嵌入IL代碼中,所以運行時也不需要分配空間。
欄位
之前的章節講過了CLR支持靜態欄位和實例欄位。
靜態欄位是放在類型對象中的,類型對象在類型載入到一個AppDomain時創建(通常就是引用了該類型的任何方法首次進行JIT編譯時),
而實例欄位是放在實例對象中的。
欄位的修飾符除了預設的實例欄位和static靜態欄位,還有readonly表示只讀欄位。
只讀欄位眾所周知,只能由一個構造器方法將值寫入,或內聯初始化(就是在代碼中聲明的時候直接賦值,而不是用構造器)。
實際上內聯初始化還是用了一個構造器來進行欄位初始化,內聯初始化只是一種語法上的簡化。(實際上內聯初始化還有一些性能問題也要考慮,下一章再寫)
當然其實還是有別的玩法的,比如用反射就可惜修改readonly欄位。
還有一個修飾符用的就不多,volatile(文檔譯為可變,作者表示為易變,因為這種欄位一般多個線程都可能想對它進行修改),說實話,在本人看著本書之前,根本不知道有這麼一個修飾符。⊙﹏⊙‖∣
當一個欄位用volatile修飾後,那麼編譯器、CLR和硬體都不會對訪問這種欄位的代碼執行“線程不安全”的優化措施。(這個東西在本書後麵線程同步中有講到,我還沒看到,以後再寫吧)