NET CLR via C#读书笔记 - 第七章 常量和字段

1 常量

1.1 常量定义

  常量是从值不变化的符号,定义常量符号时,值必须在编译阶段就确认,编译后常量将保存在程序集的元数据中。

1.2 常量的特点和限制

  ① 只能定义编译器支持的基元类型的常量,定义非基元类型的常量,必须要将值设置为null(意义不大)。
  ② 常量值永不改变,通常被视为类型的一部分(被视为静态成员,而不是实例成员)。
  ③ 定义常量会生成元数据。
  ④ 代码使用常量时,会在编译时将常量读取出来并嵌入生成的IL代码中,运行时不需要额外分配空间。
  ⑤ 由于常量编译时确定的性质,使用常量不能很好的支持跨程序集的版本控制,一旦某一版本中,定义常量的程序集修改源代码,改变常量的值,那么相对应的使用该程序集的所有应用都需要重新编译,否则在未编译的应用中依旧是使用未修改前的常量值,可能会引发应用程序的未知行为,针对此种情况,可以使用readonly修饰的字段进行代替。

2 字段

2.1 字段定义

  字段是类型的数据成员,容纳了一个值类型的实例或者引用类型的引用。

2.2 字段修饰符

CLR术语C#术语说明
Staticstatic修饰字段为类型状态的一部分,不是对象状态的一部分。
静态字段的内存分配是在类型对象中分配,而类型对象是类型加载到AppDomain中时创建。加载时机是首次引用该类型方法时进行JIT编译时。(CLR和AppDomain可阅读NET CLR via C#第22章 )
Instance(默认)修饰字段为实例状态的一部分。
内存分配是在创建类型实例时进行。
Initonlyreadonly修饰字段只能由构造器方法写入
VolatilevolatileCLR,编译器和硬件不会对使用此修饰符的字段做出“线程不安全”的代码优化。支持volatile修饰的类型有:所有引用类型,Single,Boolean,Byte,SByte,Int16,UInt16,Int32,UInt32,Char以及基础类型为Byte,SByte,Int16,UInt16,Int32,UInt32的所有枚举类型。

  以上内容为对《NET CLR via C#(第四版)》第七章内容的阅读笔记,只记录其中核心部分内容,书中还仔细描述了readonly,内联初始化等话题,如需要详细阅读请自行查阅本书第七章内容,感谢您的阅读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值