C#常量主要分為兩種:編譯時間和運行時常量
編譯時間常量用關鍵字const來定義,運行時常量用關鍵字readonly來定義
兩者區別:
編譯時間常量,在編譯時間便用該常量的值代替常量變數。
運行時常量,在運行時返回一個運行時常量的變數引用
這兩種變數引用方式會導致什麼不同呢,且看下面代碼:
引用Effective C#中的例子:定義一個類庫Limitation,其中呢定義了一個類Limitations,代碼如下:
public class Limitations
{
public static readonly int startValue =5;
public const int endValue=10;
}
該類中包含兩個量,一個是編譯時間常量,一個是運行時常量
我在主程式中,引用該類庫,並調用該類的相關值,代碼如下:
static void Main(string[] args)
{
for (int i = Limitations.startValue; i < Limitations.endValue; i++)
{
Console.WriteLine(i.ToString());
}
Console.Read();
}
運行結果:
5
6
7
8
9
現在我更新一下程式集Limitation,代碼如下:
public class Limitations
{
public static readonly int startValue =105;
public const int endValue=120 ;
}
產生一下,替換掉原來的程式集,運行結果是什麼也沒有
這是為什麼呢?原來是跟兩種變數的執行行為有關係,對於編譯時間常量,在編譯時間會用其值替換掉所有的編譯時間常量變數,當你更換程式集時,在引用的程式中,原來編譯時間常量的值不會改變,所以endValue仍為10;而對於運行時變數,因為在運行時保留的是運行時變數的引用,所以會用新的值代替掉原來的值,導致startValue的值為105.所以沒有運行結果。
從上邊的例子,我們可以看出兩種變數的使用方式,如果要使程式有好的可維護性可以選擇運行時變數。
對於編譯時間常量,由於在編譯時間就已經用值替換了變數,可以使程式在效能上有輕微的提高,所以如果程式很少有變動,則可以選擇編譯時間常量。