创建常量时尽可能使用readonly,而不是const

来源:互联网 发布:淘宝新品破冰 编辑:程序博客网 时间:2024/05/16 07:38

const float _pi = 3.1415926;

    readonly float _r = 20.23;

Const常量是编译时常量,也就是说当CLR编译器将const常量编译成中间语言IL(Intermediate Language )语言时,IL直接用const常量的值来替代了程序中对该常量的引用。

编译时常量的优缺点:

优点:效率高

缺点:可扩展性差,不灵活

Readonly常量是运行时常量。运行时常量的值是在运行时确定的。当你引用一个readonly常量时IL会为你引用一个运行时常量的变量,而不是直接使用该常量的值。

运行时常量的优缺点:

优点:可扩展性好;

缺点:效率比较低。

Readonly常量相比const常量,除了在性能上稍微逊色点外,const常量能做到的readonly常量都能做到,const常量不能做到的readonly仍然能做到, Readonly对系统性能的影响是微乎其微的,加上从系统的健壮性和可维护性来考虑,我们更应该选择伸缩性强的readonly常量。

下面例举了一些使用const常量会带来的问题:

1、            假设一系统中有两个程序集AAssemblyBAssemblyAAssembly程序集中有一const常量aBAssembly程序集引用了AAssembly程序集中的const常量a,当系统发布后我们要更新系统的版本,修改了AAssembly程序集中的const常量a的值,根据const常量的特性,如果不将BAssembly程序集重新编译,系统将会发生致命的错误:AAssemblyBAssembly中对const常量a的引用值不一样。

2、            const常量仅限于基础数据类型(数字和字符串),当我们要定义一个非基础类型的常量时该怎么办呢?const是做不到的。

以上这些问题,readonly常量都可以解决,另外由于readonly是运行时常量,我们可以在申明readonly常量时不赋初值(const常量是不行的),在构造函数(constructor)执行时对readonly常量赋值。从而为每一个类的实例存放不同的值。运行时常量可以是一个类的实例成员,也可以是一个类型的静态成员,而编译时常量只能是静态成员,因此类似:static const string m_name;的代码是不能通过编译的。