1 常量
1.1 常量定义
常量是从值不变化的符号,定义常量符号时,值必须在编译阶段就确认,编译后常量将保存在程序集的元数据中。
1.2 常量的特点和限制
① 只能定义编译器支持的基元类型的常量,定义非基元类型的常量,必须要将值设置为null(意义不大)。
② 常量值永不改变,通常被视为类型的一部分(被视为静态成员,而不是实例成员)。
③ 定义常量会生成元数据。
④ 代码使用常量时,会在编译时将常量读取出来并嵌入生成的IL代码中,运行时不需要额外分配空间。
⑤ 由于常量编译时确定的性质,使用常量不能很好的支持跨程序集的版本控制,一旦某一版本中,定义常量的程序集修改源代码,改变常量的值,那么相对应的使用该程序集的所有应用都需要重新编译,否则在未编译的应用中依旧是使用未修改前的常量值,可能会引发应用程序的未知行为,针对此种情况,可以使用readonly修饰的字段进行代替。
2 字段
2.1 字段定义
字段是类型的数据成员,容纳了一个值类型的实例或者引用类型的引用。
2.2 字段修饰符
CLR术语 | C#术语 | 说明 |
---|---|---|
Static | static | 修饰字段为类型状态的一部分,不是对象状态的一部分。 静态字段的内存分配是在类型对象中分配,而类型对象是类型加载到AppDomain中时创建。加载时机是首次引用该类型方法时进行JIT编译时。(CLR和AppDomain可阅读NET CLR via C#第22章 ) |
Instance | (默认) | 修饰字段为实例状态的一部分。 内存分配是在创建类型实例时进行。 |
Initonly | readonly | 修饰字段只能由构造器方法写入 |
Volatile | volatile | CLR,编译器和硬件不会对使用此修饰符的字段做出“线程不安全”的代码优化。支持volatile修饰的类型有:所有引用类型,Single,Boolean,Byte,SByte,Int16,UInt16,Int32,UInt32,Char以及基础类型为Byte,SByte,Int16,UInt16,Int32,UInt32的所有枚举类型。 |
以上内容为对《NET CLR via C#(第四版)》第七章内容的阅读笔记,只记录其中核心部分内容,书中还仔细描述了readonly,内联初始化等话题,如需要详细阅读请自行查阅本书第七章内容,感谢您的阅读。