常量
常量总是被视为静态成员。
常量其实可以不限于基元类型,但是必须初始化为null。(我觉得这个点知道和不知道都一样,我已经自动从脑海中忽略了。很多时候在我这个人眼中,艰涩的代码和垃圾代码,其实没有任何区别。很讨厌明明有更简单易懂的解决方案,非要去炫一些生僻无用的技术的程序员,总是喜欢用这种方式让哥哥我不能按时下班)
而且编译的时候会直接提取常量的值嵌入IL代码中,所以运行时也不需要分配空间。
字段
之前的章节讲过了CLR支持静态字段和实例字段。
静态字段是放在类型对象中的,类型对象在类型加载到一个AppDomain时创建(通常就是引用了该类型的任何方法首次进行JIT编译时),
而实例字段是放在实例对象中的。
字段的修饰符除了默认的实例字段和static静态字段,还有readonly表示只读字段。
只读字段众所周知,只能由一个构造器方法将值写入,或内联初始化(就是在代码中声明的时候直接赋值,而不是用构造器)。
实际上内联初始化还是用了一个构造器来进行字段初始化,内联初始化只是一种语法上的简化。(实际上内联初始化还有一些性能问题也要考虑,下一章再写)
当然其实还是有别的玩法的,比如用反射就可惜修改readonly字段。
还有一个修饰符用的就不多,volatile(文档译为可变,作者表示为易变,因为这种字段一般多个线程都可能想对它进行修改),说实话,在本人看着本书之前,根本不知道有这么一个修饰符。⊙﹏⊙‖∣
当一个字段用volatile修饰后,那么编译器、CLR和硬件都不会对访问这种字段的代码执行“线程不安全”的优化措施。(这个东西在本书后面线程同步中有讲到,我还没看到,以后再写吧)