C#const

示例

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,在运行时解决。