C# 有兩種常數的寫法:

  1. readonly: runtime 常數
  2. const: compile-time 常數
// compile-time 常數
public const int Millennium = 2000;

// runtime 常數
public static readonly int ThisYear = 2004;

compile-time 常數

使用 compile-time 常數 const 需要注意它會在編譯時期直接將賦值的內容取代變數。

if(myDateTime.Year == Millennium)

編譯後使用反編譯軟體查看會發現 Millennium 變數的位置直接被 2000 取代。

if(myDateTime.Year == 2000)

const 只能用來宣告數字、布林值、字串與 null 這些類型,其它類型需要使用 readonly 來宣告。

runtime 常數

使用 runtime 常數 readonlyconst 不同,它在編譯完成後還是會保留變數的參考,並不會直接用值來取代。

if (DateTime.Now.Year == ThisYear)

編譯後使用反編譯軟體查看會發現 ThisYear 變數的位置並沒有被值取代。

if (DateTime.Now.Year == ThisYear)

Summary

只有確定要在編譯期間就將變數轉換成實際值或者那些永遠不會變換的值才使用 const 宣告常數,否則應該盡量使用 readonly 宣告常數。