一聚教程网:一个值得你收藏的教程网站

热门教程

asp.net C#定义常量与变量详解

时间:2022-06-25 08:17:53 编辑:袖梨 来源:一聚教程网

 常量也为这些值提供了一便于人们阅读的形式,但不同于枚举,常量只是单个值,而且如它们的名称所示,它们是固定的而且从不改变。在需要使用固定值的情况下这非常有用;使用常量意味着您可以为该值命名,并且在代码中使用该名称。该值只定义一次,因此便于修改,而且由于在代码中使用了便于阅读的名称,因此代码也变得更容易维护。

    即使该值只使用一次,使用常量也是明智的,因为它们提供了一种方法将固定值的这种类型集中在一起。定义常量的语法如下所示:

 代码如下 复制代码

    Private Const ConstantName As Type=Value

    Const将值定义为常量,Private是指该常量的可视性-在本章的稍后部分将会介绍。该声明的剩余部分与其他所有变量一样,区别在于声明的值为常量,因此不能修改。

    例如,在Wrox United的Web站点中,有一个购物车存放从商店购买的货物。俱乐部的成员可以享受10%的优惠,因此该值可以作为一个常量保存:

 代码如下 复制代码

    Private Const MemberDiscountPercentage As Single=0.1

    在计算完订单的总价格之后,可以像使用其他任何变量一样使用该常量:

 代码如下 复制代码

    MemberDiscount=subtotal=MemberDiscountPercentage
    Total=SubTotal-MemberDiscount


C#中定义常量的方式有两种,一种叫做静态常量(Compile-time constant),另一种叫做动态常量(Runtime constant)。前者用“const”来定义,后者用“readonly”来定义。

对于静态常量(Compile-time constant),它的书写方式如下:

 代码如下 复制代码

  public const int MAX_VALUE = 10;

  为什么称它为静态常量呢,因为如上声明可以按照如下理解(注意:如下书写是错误的,会出编译错误,这里只是为了方便说明)。

 代码如下 复制代码

  public static const int MAX_VALUE = 10;

  用const定义的常量,对于所有类对象而言都是一样的,因此需要像访问静态成员那样去访问const定义的常量,而用对象的成员方式去访问会出变异错误。此外,对于静态常量的访问在编译的时候,是用常量的值去替换常量,例如:

 代码如下 复制代码

  int nValue = MAX_VALUE;

  这句在编译之后,和如下这句所产生的中间语言代码是一样的。

 代码如下 复制代码

  int nValue = 10;

  不过,在用const来定义常量的时候,在类型上有很多限制。首先,此类型必须属于值类型,同时此类型的初始化不能通过new来完成,因此一些用struct定义的值类型常量也不能用const来定义。

  相对于const而言,用readonly来定义常量要灵活的多,它的书写方式如下:

 代码如下 复制代码

  public readonly int MAX_VALUE = 10;

  为什么称为动态变量,因为系统要为readonly所定义的常量分配空间,即和类的其他成员一样拥有独立的空间。此外,readonly所定义的常量除了在定义的时候可以设定常量值外,还可以在类的构造函数中进行设定。由于readonly所定义的常量相当于类的成员,因此使用const来定义常量所受到的类型限制,在使用readonly去定义的时候全部消失,即可以用readonly去定义任何类型的常量。
 

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

对于在定义常量的时候,到底是用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去定义常量。

 
总结

常量就是其值固定不变的数据,常量的值在编译时就已经确定了。常量的类型只能为下列类型之一:sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、和string等。

C#中使用关键字const来声明常量,并且在声明常量是,必须要其进行初始化。

变量不同,常量一旦被定义,在常量的作用域内,常量的值就不能改变了。

热门栏目