选择readonly而不是const
对于常量,C#里有两个不同的版本:编译时常量(const)和运行时常量(readonly)。保留const是为了满足那些对性能要求苛刻,且其值永远不发生改变的常量使用的
l
const效率更高
l
readonly可维护性好
l
const仅限于数字和字符串
l
readonly可以是一个类的实例成员,也可以是一个类型的静态成员,从而为每一个类的实例存放不同的值。而const只能是静态成员
即:
public static readonly string s2 = "类型的静态成员";
而:
看下面的例子,const与readonly不同之处表现在如何对他们的访问上。
public const int constExample = 2000;
if(myDateTime.Year == constExample)
会与下面写的代码编译成完全相同的IL代码,也就是说在编译的时候是将const变量的值直接复制到使用它的地方。
if(myDateTime.Year == 2000)
而readonly的值是在运行时确定的。当你使用readonly变量时,引用还是这个变量,而不是直接使用该值。
核心:
const与readonly的这个区别在(系统)维护上有深远的潜在影响。
就拿我们现在有的aaf与BK举例:
假设我们在A程序集中定义了一个const的变量,而B程序集依赖A并使用了这个变量。如果有一天我们需要对A中的const变量的值做修改,按照一般的做法,我们直接把A更新到服务器即可。这个时候并不会重新去编译、更新B,我们认为B中使用的变量也会随之改变,但事实上,B中的值还是原来的。
产生这个问题的原因就在于const是在编译时直接复制其值到使用它的地方,也就是只要B不引用新的A并重新编译,那么B中的值就还会是原来的。
总结:
虽然在性能上略有一些差异,但是无论如何,宁愿选择伸缩性更强的readonly。
l
const效率更高
l
readonly可维护性好
l
const仅限于数字和字符串
l
readonly可以是一个类的实例成员,也可以是一个类型的静态成员,从而为每一个类的实例存放不同的值。而const只能是静态成员
即:
public readonly string s1 = "类型的实例成员";
public static readonly string s2 = "类型的静态成员";
而:
public const string s = "const只能是静态成员";
看下面的例子,const与readonly不同之处表现在如何对他们的访问上。
public const int constExample = 2000;
if(myDateTime.Year == constExample)
会与下面写的代码编译成完全相同的IL代码,也就是说在编译的时候是将const变量的值直接复制到使用它的地方。
if(myDateTime.Year == 2000)
而readonly的值是在运行时确定的。当你使用readonly变量时,引用还是这个变量,而不是直接使用该值。
核心:
const与readonly的这个区别在(系统)维护上有深远的潜在影响。
就拿我们现在有的aaf与BK举例:
假设我们在A程序集中定义了一个const的变量,而B程序集依赖A并使用了这个变量。如果有一天我们需要对A中的const变量的值做修改,按照一般的做法,我们直接把A更新到服务器即可。这个时候并不会重新去编译、更新B,我们认为B中使用的变量也会随之改变,但事实上,B中的值还是原来的。
产生这个问题的原因就在于const是在编译时直接复制其值到使用它的地方,也就是只要B不引用新的A并重新编译,那么B中的值就还会是原来的。
总结:
虽然在性能上略有一些差异,但是无论如何,宁愿选择伸缩性更强的readonly。
浙公网安备 33010602011771号