《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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章