Effective C# Item 2: Prefer readonly to const

Effective C# Item 2:Prefer readonly to const

      C#拥有两种不同的常量:静态常量(compile-time constants)和动态常量(runtime constants)。它们有不同的特性,错误的使用不仅会损失效率,还可能造成错误。相比之下,静态常量在速度上会稍稍快一些,但是灵活性却比动态常量差很多。

None.gif // 静态常量
None.gif
public   const   int  compiletimeConstant  =   1
None.gif
// 动态常量
None.gif
public   static   readonly  runtimeConstant  =   1 ;

      静态常量在编译时会将其替换为所对应的值,也就是说下面这2句话通过编译器编译后产生的IL是一样的。

None.gif // 通过编译后二者会被翻译成相同的中间语言
None.gif
int  myNum  =  compiletimeConstant;
None.gif
int  myNum  =   1 ;

      动态常量的值是在运行时获得的。IL中将其标为只读常量,而不是用常量的值代替。

      静态常量只能被声明为简单的数据类型(内建的int和浮点型)、枚举或字符串。下面的程序段是通不过编译的。你不能用new关键字初始化一个静态常量,即便是对一个值类型来说。

None.gif // 这样是错误的
None.gif
public   const  DateTime myDateTime  =   new  DateTime( 2006 , 9 , 1 , 0 , 0 , 0 );
None.gif
// 这样是可以的
None.gif
public   static   readonly  DateTime myDateTime  =   new  DateTime( 2006 , 9 , 1 , 0 , 0 , 0 );

      只读数据也是常量的一种,它们不能在构造器初始化之后被修改。但是它同静态常量不同,它的值是在运行时才被指派的,因此就会获得更大的灵活性。动态常量可以是任意的数据类型。

      二者最大的差别在于:静态常量在编译时会将其换为对应的值,这就意味着对于不同的程序集来说,当你改变静态常量的时候需要将其重新编译,否则常量的值不会发生变化,可能引发潜在的问题,而动态常量就不会有这种情况。

      从另一方面来说,如果你的确要声明一些从不改变且处处唯一的常量,例如钩子函数SetWindowsHookEx的idHook参数或序列化时的版本等,就应该使用静态常量。但是用到这样的常量的机会不多。一般来说我们应该使用灵活性更高的动态常量。

译自   Effective C#:50 Specific Ways to Improve Your C#                      Bill Wagner著

      对于compile-time constants有的地方翻译为“编译时常量”。由于它是具有静态特征的,所以我还是用了静态常量的说法。而对于runtime constants就相当于一个可以在类构造器里进行修改的只读的数据成员。

 

静态常量

动态常量

内存消耗

因为要保存常量 有消耗

初始化

很少的简单类型,不能new,必须在声明同时赋值

任意类型,可以在类构造函数中赋值

何时发挥作用

编译时进行替换

相当于类中的数据成员


回到目录

转载于:https://www.cnblogs.com/aiyagaze/archive/2006/09/01/490310.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值