说到常量,我们肯定能想到的是const与readonly,同时readonly也叫只读变量。所谓常量,即在初始化后,不能再对其值做更改,只能使用的变量。在实际编码过程中,我们可能很少用到const与readonly,其实不是用不到,而是我们对这两个修饰符了解不够或理解不深,所以不清楚什么时候需要用到他们。在说这两个修饰符前,先带入一下编译时常量(compile-time)和运行时常量(runtime)。
- 编译时常量:程序编译时将对常量值进行解析,并将所有常量引用替换为相应值。编译时常量效率更高,但可能会有错误
- 运行时常量:程序运行时进行赋值,赋值完成后便无法更改。运行时常量在产生IL时是产生该常量的引用,而不是它的值。它可以被初始化成任何类型
一. const、readonly和static readonly各自特性
- const是编译时常量,定义时必须指定其初始值,并且其定义的常量默认为静态。
- readonly是运行时常量,定义时可以不进行初始化,当没有初始化时,需在构造函数中初始,需要注意的是,其常量初始值在构造函数中的优先级更高。其定义的常量默认为非静态。
- static readonly虽然它是readonly的静态形式,但是除了readonly的特性外,还有一点需要特别注意,就是在构造函数内指定初始值时,这个构造函数必须是静态无参构造函数。
- 相对来说,cosnt较高效,readonly较灵活。在应用上可以用static readonly代替const,以此平衡const在灵活性上的不足,同时还能克服编译器优化cosnt性能,所带来的程序集引用不一致问题。
二. const与readonly可修饰的值类型
- const:
- 只能为下列类型之一(或能转换为下列类型):sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、enum类型。
- 能够声明为const的引用类型只能为string或值为null的其他引用类型。
- object、Array(数组)和struct(结构)不能被声明为const常量。
- readonly:任何类型
三. 注意事项
- const可用于修饰类的成员(field)或者一个局部变量(local variable),而readonly仅用于修饰类的成员(field)。
- const在定义时初始,不能在构造函数中初始,而readonly的初始可以在定义时也可以在构造函数中,且在构造函数中的初始值优先级更高。
- 因为const的常量在编译时,会将所有用到此常量的值初始化,为了避免字段冲突等情况,引起错误,对于类的const常量,尽量用完整的,全大写的英文单词组成。
- 不能在类,方法,属性等上面使用readonly