常量
const
用於表示在程式的整個生命週期中永遠不會改變的值。它的值在編譯時是常量,而不是 readonly
關鍵字,其值在執行時是常量。
例如,由於光速永遠不會改變,我們可以將它儲存在一個常數中。
const double c = 299792458; // Speed of light
double CalculateEnergy(double mass)
{
return mass * c * c;
}
這與 return mass * 299792458 * 299792458
基本相同,因為編譯器將直接用其常量值替換 c
。
因此,c
一旦宣告就無法更改。以下將產生編譯時錯誤:
const double c = 299792458; // Speed of light
c = 500; //compile-time error
常量可以使用與方法相同的訪問修飾符作為字首:
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;
}
這些不能以 private
或 public
關鍵字作為字首,因為它們隱含在它們定義的方法的本地。
並非所有型別都可以在 const
宣告中使用。允許的值型別是預定義型別 sbyte
,byte
,short
,ushort
,int
,uint
,long
,ulong
,char
,float
,double
,decimal
,bool
和所有 enum
型別。嘗試使用其他值型別(例如 TimeSpan
或 Guid
)宣告 const
成員將在編譯時失敗。
對於特殊的預定義引用型別 string
,可以使用任何值宣告常量。對於所有其他引用型別,可以宣告常量,但必須始終具有值 null
。
因為 const
值在編譯時是已知的,所以它們被允許作為 switch
語句中的 case
標籤,作為可選引數的標準引數,作為屬性規範的引數,等等。
如果在不同的程式集中使用 const
值,則必須注意版本控制。例如,如果程式集 A 定義了 public const int MaxRetries = 3;
,而程式集 B 使用該常量,那麼如果 MaxRetries
的值稍後在程式集 A 中更改為 5
(然後重新編譯),則該更改在程式集 B 中將無效,除非程式集 B 也被重新編譯(參考新版本的 A)。
因此,如果某個值可能會在程式的未來版本中發生更改,並且該值需要公開顯示,請不要宣告該值 const
,除非你知道每當更改某些內容時都會重新編譯所有依賴程式集。替代方案是使用 static readonly
而不是 const
,它在執行時解析。