核心归纳
常量:代码文件中的数据字段
① 常量是个占位符,不占用内存。
想象:有两段代码用同一个常量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更贴切