C#箴言:定义常量的两种方法

2016-02-19 15:22 7 1 收藏

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的C#箴言:定义常量的两种方法,过去的都会过去,迎接崭新的开始,释放更美好的自己。

【 tulaoshi.com - 编程语言 】

  在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) 定义声明的同时要设置常量值。声明的时候可以不需要进行设置常量值,可以在类的构造函数中进行设置。 类型限制首先类型必须属于值类型范围,且其值不能通过new来进行设置。没有限制,可以用它定义任何类型的常量。 对于类对象而言对于所有类的对象而言,常量的值是一样的。对于类的不同对象而言,常量的值可以是不一样的。 内存消耗无。要分配内存,保存常量实体。 综述性能要略高,无内存开销,但是限制颇多,不灵活。灵活,方便,但是性能略低,且有内存开销。

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

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  

public const int MAX_VALUE = 10;

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

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  

public const int MAX_VALUE = 15;

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

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

  鉴于此,本书建议用readonly来替换const去定义常量。

来源:http://www.tulaoshi.com/n/20160219/1609502.html

延伸阅读
运动医学专家认为,人体是一个动态的全面平衡体系,因此运动应是全方位的,既包括正向运动,也包括反序运动,这样才能达到人体所需要的那种动态的全面平衡。运动着的器官由于受到张弛的反序,便可以使伸肌和屈肌得到锻炼,进而起到强身健体的作用。 另类健康法之反序运动三法 反序运动是由德国运动医学专家倡导的,现今欧美国...
标签: 电脑应用
用AutoCAD画粗实线有多种办法,以满足国家标准对机械图样中的线型的规定。 方法一: 最简便的办法是使用lweight命令。此命令可在命令行直接键入,或选择下拉菜单Format(格式)/Lineweight(线宽),在出现的对话框中,设置所需线宽,缺省线宽为0.25mm,并可用滑块调整屏幕上线宽显示比例,该命令为透明命令。 方...
标签: PS PS基础
想赋予你的扫街作品更多的情绪?后期可以让照片更加精彩。这次,我们通过两种不同的后期手法,打造两张风格不尽相同、却抒发着同样的怀旧情绪的扫街作品,快来看看我们是怎么做的吧。 修改前 修改后 手法一 制造颗粒 重回黑白时代 通过在photoshop中简单的5步后期,为街拍增添怀旧颗粒感,制作一张仿 佛是用ISO1600的胶片拍出的经典黑白老...
标签: 孕前
两种方法可以预防乳房变形 游川指出,怀孕后女性乳房内的荷尔蒙、脂肪和乳腺组织都会增加,从而使乳房明显变大。但女性生产完后,体内荷尔蒙量降低,脂肪和乳腺组织都快速减少,已经被撑大的乳房皮表自然就松垮下来了。所以,无论是否进行母乳喂养,女性的乳房都会有所下垂,因此可以预防。而对于已tuLaoShi.com经轻微下垂的乳房,可以进行局...
标签: 办公软件
在用Excel录入完大量数据后,不可避免地会产生许多错误。通常而言,多数用户都是一手拿着原始数据,一手指着计算机屏幕,进行手工的数据校验,这不但容易导致眼睛疲劳,而且效率不高。为此,笔者特向大家介绍两种轻松且高效的数据校验方法 一、语音校验法 我们可以使用Excel的“文本到语音”功能,将Excel工作表中的数据读出来给...

经验教程

440

收藏

9
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部