• 1
  • 2
  • 3
  • 4
  • 5
asp.net空间 首 页  »  帮助中心  »  虚拟主机  »  asp.net空间
比较C#定义常量的两种方法
发布日期:2015-10-13 22:10:38
 

  比较C#定义常量的两种方法

  根据前文对C#定义常量的两种方法介绍,对静态常量和动态常量有了一定的了解。可是他们之间又有什么联系和区别呢?今天就为大家比较这两种方法。对比两者之间的区别具体如下列所示:

                 静态常量(Compile-time constant)                           动态常量(Runtime constant)

  定义           声明的同时要设置常量值。                                 声明的时候可以不需要进行设置常量值,可以在类的构造函数中进行设置。

  内存消耗       无。                                                                  要分配内存,保存常量实体。

  对于类对象而言 对于所有类的对象而言,常量的值是一样的。                  对于类的不同对象而言,常量的值可以是不一样的。

  类型限制  首先类型必须属于值类型范围,且其值不能通过new来进行设置。 没有限制,可以用它定义任何类型的常量。

  综合性能       性能要略高,无内存开销,但是限制颇多,不灵活。            灵活,方便,但是性能略低,且有内存开销。

  综上所述,我们可以知道对于在定义常量的时候,到底是用const来定义还是readonly来定义,从前前为了追求性能,因此尽量用const来定义。但是之前在书中看到了一个关于使用const会产生潜在的bug,就是在程序中使用DLL类库某个类的静态常量时,如果再在类库中修改静态常量的值,这是其它接口不会发生变化。一般,程序调用端是不需要重新编译,直接执行就可以调用新的类库。由于静态常量在编译的时候,是用它的值去替换常量,因此在调用端的程序也是这样进行替换的。所以在此情况下,会产生潜在的bug。

  例如:在类库中定义了一个静态常量,如下:

  public const int MAX_VALUE = 10;

  那么,对于程序中调用此静态常量这段代码,在编译后产生的中间语言代码中,是用10来进行替换,即使用静态常量的地方,改为10了。

  那么当类库的静态变量发生变化后,例如:

  public const int MAX_VALUE = 15;

  对于调用端程序是可以在没有重新编译的情况下进行运行,不过此时程序的中间语言代码对应于静态变量的值是10,而不是新类库中的15。因此这样产生的不一致,程序会引发潜在的bug。您要是想解决此类问题就需要调用端程序在更新类库之后重新编译一下,即生成新的中间语言代码。

    对于如上在const定义常量时所存在的潜在bug,在用readonly定义常量时是不会发生的。因为readonly定义的常量类似于类的成员,因此在访问的时候需要根据具体常量地址来访问,从而避免此类bug。综上所述,建议您尽量用readonly来替换const去定义常量。