常量

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;
}

這些不能以 privatepublic 關鍵字作為字首,因為它們隱含在它們定義的方法的本地。

並非所有型別都可以在 const 宣告中使用。允許的值型別是預定義型別 sbytebyteshortushortintuintlongulongcharfloatdoubledecimalbool 和所有 enum 型別。嘗試使用其他值型別(例如 TimeSpanGuid)宣告 const 成員將在編譯時失敗。

對於特殊的預定義引用型別 string,可以使用任何值宣告常量。對於所有其他引用型別,可以宣告常量,但必須始終具有值 null

因為 const 值在編譯時是已知的,所以它們被允許作為 switch 語句中的 case 標籤,作為可選引數的標準引數,作為屬性規範的引數,等等。

如果在不同的程式集中使用 const 值,則必須注意版本控制。例如,如果程式集 A 定義了 public const int MaxRetries = 3;,而程式集 B 使用該常量,那麼如果 MaxRetries 的值稍後在程式集 A 中更改為 5(然後重新編譯),則該更改在程式集 B 中將無效,除非程式集 B 也被重新編譯(參考新版本的 A)。

因此,如果某個值可能會在程式的未來版本中發生更改,並且該值需要公開顯示,請不要宣告該值 const,除非你知道每當更改某些內容時都會重新編譯所有依賴程式集。替代方案是使用 static readonly 而不是 const,它在執行時解析。