常量

 
常量是在编译时已知并在程序的生存期内不发生更改的不可变值。 
 
在程序中使用常量至少有3个好处:
A.常量用易于理解的清楚的名称替代了含义不明确的数字或字符串,使程序更易于阅读。
B.常量使程序更易于修改。
C.常量更容易避免程序出现错误。如果要把另一个值赋给程序中的一个常量,而该常量已经有了一个值,编译器就会报告错误。
 
在C#中定义常量的方式有两种:静态常量(Compile-time constant),动态常量(Runtime constant)。
常量可标记为 publicprivateprotectedinternalprotectedinternal 
 
静态常量:(用户定义的类型(包括类、结构和数组)不能为 const)(string类型可以用Const)
    用“const”来定义,public const int MAX_VALUE = 10;
 
动态常量:
    用“readonly”来定义,public readonly int MAX_VALUE = 10;
 
 
 
 静态常量(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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值