字段是一种数据成员,其中存放值类型的实例或者引用类型的引用,下表给出了可用于字段的修饰符。
CLR术语 |
C#术语 |
描述 |
Static |
static |
该字段是类型状态的一部分,而不是对象的状态的一部分 |
Instance |
默认 |
该字段与类型的实例相关联,而不是与类型本身相关联 |
InitOnly |
readonly |
该字段只能由构造器方法包含的代码写入 |
Volatile |
volatile |
访问该字段的代码不受线程不安全(threadunsafe)优化的制约,而这种优化可能是由编译器、CLR或者硬件来执行的,只有下述类型可以标记为volatile:所有的引用类型,Signle,Boolean,Byte,SByte,Int16 , UInt16 , Int32 , UInt32 , Char以及基本类型为Byte,SByte,Int16,UInt16,Int32或者UInt32的枚举类型。 |
公共语言运行库(Common Language Runtime,CLR)同时支持类型(静态)字段和实例(非静态)字段。对于类型字段,存放字段数据所需的动态内存是在类型对象内部分配的,而动态内存是在类型加载到应用程序域(AppDomain)时创建的,也就是说在首次引用类型时才创建动态内存,也即JIT编译。对于实例字段,创建类型实例时才分配字段的动态内存。
因为字段存储在动态内存中,所以只有在运行时才可以得到字段的值。字段同样可以解决常量存在的版本控制问题。另外,字段可以是任何数据类型,因此不必将字段限制为编译器内置的基元类型(常量在类型上存在限制)。
CLR支持只读字段或者读/写字段。大多数字段是读/写字段,这意味着在执行代码过程中字段的值可能改变数次。但是,只读字段只能在构造器方法中写入数值(称之为一次写,即在对象首次创建时写入。需要注意的是,可以采用反射(reflection)来修改readonly字段。