条款2:运行时常量(readonly)优于编译时常量(const)
结论:只有当某些情况要求变量的值必须在编译时可用,才应该考虑使用const,例如:特性(attribute)类的参数,枚举定义,以及某些不随组件版本变化而改变的值。否则,对于其他任何情况,都应该优先选择readonly常量,从而获得其所具有的灵活性。
基础语法:
C#语言有两种不同的常量机制:一种为编译时(compile-time)常量,一种为运行时(runtime)常量。使用readonly关键字来声明运行时常量,用const关键字来声明编译时常量。
2 public const int _Millennium = 2000 ;
3 // 运行时常量:
4 public static readonly int _ThisYear = 2004 ;
5
特点差异:
编译时常量与运行时常量行为的不同处在于它们的访问方式。编译时常量在编译后的结果代码中会被替换为该常量的值,运行时常量的值则在运行时对readonly变量(而非它的值)进行引用。
编译时常量只可以用于基元类型(包括内建的整数类型和浮点类型)、枚举类型或字符串类型。只读(read-only)字段的类型就没有任何限制。
性能比较:
使用const较之于使用readonly的唯一好处就是性能:使用已知常量值的代码效率要比访问readonly值的代码效率稍好一点。但是这其中的效率提升是非常小的,大家应该和其所失去的灵活性进行一番权衡比较。在打算放弃灵活性之前,一定要对两者的性能差别做一个评测。
讨论:
这一条款里面说到了使用Const会造成的一种错误:在两个项目中,一个项目定义了一个Const常量,另一个项目使用这个常量;如果对常量的值进行修改,而对使用的项目不进行编译则会出现另一个项目中还是修改以前的值。通过上面的语法解释就很好理解因为编译后的结果代码中会被替换为该常量的值造成的。Readonly则不会出现这个问题;
上面说的在实际的项目进行中不太会出现这样的问题;你对版本的更新总是要Release以后来部署的,这个过程就是对整个项目的一个编译过程;当然你在调试过程中是会出现这个问题的。