第8章 常数与字段
8.1 常数
常数通常只能是编译器认为的基元类型,在编译时编译器将常数的值保存在其所定义模块的元数据内。枚举类型由于本身以基元类型形式存储,故也可以被用来定义常数。(这里枚举以基元类型存储不知道是指在CTS里都是这样还是特指C#里的做法)常数总是被认为是类型的一部分而非实例
C#不允许为常数指定static关键字,因为常数隐含为static
因为常数是在编译时被直接把值嵌入到IL代码中,而不是运行时加载,所以如果需要一个模块中的数值能够在运行时被另一个模块获取(也就是需要在这个模块中改变了数值之后调用它的模块不需要重新编译就能够在运行时获取这个新的值)就不应该使用常数
8.2 字段
CLR支持类型和实例两种字段(即静态和非静态)。对于类型字段,系统在该类型被加载进入一个应用程序域时为其分配动态内存,这通常发生在引用该类型的方法第一次被JIT编译时。对于实例字段,系统在该类型的实例被构建时为其分配动态内存
CLR支持只读和读写两种字段的访问方式。只读字段只能在构造器内被赋值(值得注意的是在构造器内部只读字段却可以被多次赋值)
const与static readonly的区别就是一个是编译时加载一个是运行时加载(可能还有其他区别),如上一节的例子,需要需要一个模块中的数值能够在运行时被另一个模块获取就应使用static readonly
C#允许我们采用内联的方式来初始化一个类的常数、读写字段和只读字段,即直接在声明的时候用等号对其赋值。事实上C#对字段的内联初始化仅仅是一种简化的表达方式,实际的初始化操作是在构造器中完成的(对常数则应该是只有内联这一种初始化的方法)