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