在C#中設定常數時,盡量使用 “readonly” 而不要使用 “const“,這樣有著許多好處,以下舉例說明:

行為

const 為c ompile-time 常數;而 readonly 為 runtime 常數。runtime 常數在執行時取值,可以用反組譯(IL)發現 readonly 是參考變數而非其值

測試程式:

const int myConst = 100;
static readonly int myReadOnly = 200;

private void button1_Click(object sender, EventArgs e)
{
    int test = 150;
    if (test == myConst) ;
    if (test == myReadOnly) ;    
}

反組譯後程式:

private const int myConst = 100;
private static readonly int myReadOnly = 200;

private void button1_Click(object sender, EventArgs e)
{
    int test = 150;
    if (test == 100)
    {
    }
    if (test == Form1.myReadOnly)
    {
    }
}

可以發現使用 const 的變數 myConst 在 if 判斷式中直接以 100 顯示;而 myReadOnly 則還是變數。

再舉個例子:

class Test
{
    public static readonly int StartValue = 5;
    public const int EndValue = 10;
}

在另一專案中使用中使用 Test class

private void button1_Click(object sender, EventArgs e)
{
    for (int i = Test.StartValue; i < Test.EndValue; i++)
    {
        Console.WriteLine("value is {0}", i);
    }
}

可得到以下結果:

value is 5
value is 6
value is 7
value is 8
value is 9

接著更改 Test 內容,並 沒有 全部rebuild

class Test
{
    public static readonly int StartValue = 15;
    public const int EndValue = 20;
}

預期結果為:

value is 15
value is 16
value is 17
value is 18
value is 19

但實際上卻什麼都不會印出,原因是因為專案用到的 EndValue 變數已經存在,其值為 10,而 StartValue 變數是 runtime 也就是15。


支援變數型態

const 只能使用 C# 原生的資料型態;而 readonly 則毫無限制。


效能

因 const 為 compile-time 故較 readonly 的 runtime 稍快。若非 100% 之後一定不會做更改才建議使用 const(例如圓周率 pi)。