c#中,const是默认具有static属性的,【这与c++语言有些不同】。因此不允许在const前有static修饰。
说到const,就很难不提到另外一个东西 readonly,readonly只读量。从语义上来说,就是是只读的。c#中可以进行内联赋值或者在构造器中进行赋值,而不允许其他方法对只读量进行改写【可以通过反射进行修改】
那么,const和readonly区别在哪里:
const是常量。readonly是只读量。
const的”常“体现在它是编译时的量,也就是对于const修饰的变量的赋值,必须能够在编译时期获得。
而readonly这种只读量是在运行时获得值。
c#中,const只能用来修饰基元类型【byte,sbyte,int16,int32,bool。。。】,其实也可以修饰引用变量,前提是将其赋值为null.
举个例子说说const和readonly的一个”有趣“的地方:
class ConstV{
public const int age = 15;
}
将其编译为一个dll文件。
然后在新项目中引用上面的dll:
class Demo{
public static void Main(String[] args){
System.Console.WriteLine(ConstV.age);
}
}
编译运行后,将dll文件删除掉,发现依然是可以的,此时,将dll文件中age从15改为1000,运行Demo程序集,结果仍然是15。查看IL代码会发现,age这个值15是直接嵌入到了exe中,除非修改了dll后,再重新编译demo程序集。
而将ConstV中的const改为 static readonly,会发现,demo程序集的运行离不开dll了,当在dll中作出修改,并编译重新生成dll后,不用对demo程序进行重新编译,运行,值依然会发生改变【和dll中一致】。
从这个小例子中应该能够体会出const和readony的一点用途吧。