const用于表示在程序生命周期中永远不变的值。它的值从compile-time开始是常量,而不是readonly关键字,关键字从运行时开始是常量。
例如,由于光速永远不会改变,因此我们可以将其存储为常数。
const double c = 299792458; // 光速 double CalculateEnergy(double mass) { return mass * c * c; }
这本质上与have相同return mass * 299792458 * 299792458,因为编译器将直接c用其常数替换。
结果,c一旦声明就无法更改。以下将产生编译时错误:
const double c = 299792458; // 光速 c = 500; //编译时错误
常量可以使用与方法相同的访问修饰符作为前缀:
private const double c = 299792458; public const double c = 299792458; internal const double c = 299792458;
const成员是static天生的。但是,static不允许显式使用。
您还可以定义方法局部常量:
double CalculateEnergy(double mass) { const c = 299792458; return mass * c * c; }
它们不能以privateor或public关键字作为前缀,因为它们对于定义它们的方法是隐式本地的。
并非所有类型都可以在const声明中使用。所允许的值的类型,是预先定义的类型sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal,bool,和所有enum类型。尝试声明const具有其他值类型(例如TimeSpan或Guid)的成员将在编译时失败。
对于特殊的预定义引用类型string,可以使用任何值声明常量。对于所有其他引用类型,可以声明常量,但必须始终具有value null。
因为const值在编译时是已知的,所以可以将它们用作语句中的case标签switch,作为可选参数的标准参数,作为属性规范的参数,等等。
如果const在不同的程序集中使用值,则必须注意版本控制。例如,如果程序集A定义a public const int MaxRetries = 3;,而程序集B使用该常数,则如果MaxRetries稍后将其值更改为5程序集A中的值(然后重新编译),则该更改在程序集B中将无效,除非程序集B为还重新编译(参考A的新版本)。
因此,如果某个值在以后的程序修订版中可能发生更改,并且该值需要公开显示,则不要声明该值,const除非您知道每当有更改时所有相关程序集都将重新编译。替代方法是使用static readonly代替const,在运行时解决。