C#常量——const和readonly
C#常量主要分为两种:编译时和运行时常量
编译时常量用关键字const来定义,运行时常量用关键字readonly来定义
两者区别:
编译时常量,在编译时便用该常量的值代替常量变量。
运行时常量,在运行时返回一个运行时常量的变量引用
这两种变量引用方式会导致什么不同呢,且看下面代码:
引用Effective C#中的例子:定义一个类库Limitation,其中呢定义了一个类Limitations,代码如下:
public class Limitations
{
public static readonly int startValue =5;
public const int endValue=10;
}
该类中包含两个量,一个是编译时常量,一个是运行时常量
我在主程序中,引用该类库,并调用该类的相关值,代码如下:
static void Main(string[] args)
{
for (int i = Limitations.startValue; i < Limitations.endValue; i++)
{
Console.WriteLine(i.ToString());
}
Console.Read();
}
运行结果:
5
6
7
8
9
现在我更新一下程序集Limitation,代码如下:
public class Limitations
{
public static readonly int startValue =105;
public const int endValue=120 ;
}
生成一下,替换掉原来的程序集,运行结果是什么也没有
这是为什么呢?原来是跟两种变量的执行行为有关系,对于编译时常量,在编译时会用其值替换掉所有的编译时常量变量,当你更换程序集时,在引用的程序中,原来编译时常量的值不会改变,所以endValue仍为10;而对于运行时变量,因为在运行时保留的是运行时变量的引用,所以会用新的值代替掉原来的值,导致startValue的值为105.所以没有运行结果。
从上边的例子,我们可以看出两种变量的使用情况,如果要使程序有好的可维护性可以选择运行时变量。
对于编译时常量,由于在编译时就已经用值替换了变量,可以使程序在性能上有轻微的提高,所以如果程序很少有变动,则可以选择编译时常量。