选择readonly而不是const

对于常量,C#里有两个不同的版本:编译时常量(const)和运行时常量(readonly)。保留const是为了满足那些对性能要求苛刻,且其值永远不发生改变的常量使用的

l
const效率更高
l
readonly可维护性好
l
const仅限于数字和字符串
l
readonly可以是一个类的实例成员,也可以是一个类型的静态成员,从而为每一个类的实例存放不同的值。而const只能是静态成员
即:



public readonly string s1 = "
类型的实例成员";


public static readonly string s2 = "类型的静态成员";
而:


public const string s = "const
只能是静态成员";




看下面的例子,constreadonly不同之处表现在如何对他们的访问上。
public const int constExample = 2000;
if(myDateTime.Year == constExample)

会与下面写的代码编译成完全相同的IL代码,也就是说在编译的时候是将const变量的值直接复制到使用它的地方。
if(myDateTime.Year == 2000)

readonly的值是在运行时确定的。当你使用readonly变量时,引用还是这个变量,而不是直接使用该值。

核心:
constreadonly的这个区别在(系统)维护上有深远的潜在影响。
就拿我们现在有的aafBK举例:
假设我们在A程序集中定义了一个const的变量,而B程序集依赖A并使用了这个变量。如果有一天我们需要对A中的const变量的值做修改,按照一般的做法,我们直接把A更新到服务器即可。这个时候并不会重新去编译、更新B,我们认为B中使用的变量也会随之改变,但事实上,B中的值还是原来的。
产生这个问题的原因就在于const是在编译时直接复制其值到使用它的地方,也就是只要B不引用新的A并重新编译,那么B中的值就还会是原来的。


总结:
虽然在性能上略有一些差异,但是无论如何,宁愿选择伸缩性更强的readonly

posted on 2012-01-31 18:07  东风梦遥  阅读(256)  评论(0)    收藏  举报

导航