const 與readonly區別
const與readonly 很像,都是將變數宣告為只讀,且在變數初始化後就不可改寫。那麼,const與readonly 這兩個修飾符到底區別在什麼地方呢?其實,這個牽扯出C#語言中兩種不同的常量型別:靜態常量(compile-time constants)和動態常量(runtime constants)。這兩者具有不同的特性,錯誤的使用不僅會損失效率,而且還會造成錯誤。
首先先解釋下什麼是靜態常量以及什麼是動態常量。靜態常量是指編譯器在編譯時候會對常量進行解析,並將常量的值替換成初始化的那個值。而動態常量的值則是在執行的那一刻才獲得的,編譯器編譯期間將其標示為只讀常量,而不用常量的值代替,這樣動態常量不必在宣告的時候就初始化,而可以延遲到建構函式中初始化。
當你大致瞭解上面的兩個概念的時候,那麼就可以來說明const與readonly了。const修飾的常量是上述中的第一種,即靜態常量;而readonly則是第二種,即動態常量。那麼區別可以通過靜態常量與動態常量的特性來說明:
1)const修飾的常量在宣告的時候必須初始化;readonly修飾的常量則可以延遲到建構函式初始化
2)const修飾的常量在編譯期間就被解析,即常量值被替換成初始化的值;readonly修飾的常量則延遲到執行的時候
此外const常量既可以宣告在類中也可以在函式體內,但是static readonly常量只能宣告在類中。
<span style="font-size:18px;">class Program { class Test { public const int constTest = 2; public readonly int readonlyTest; //也可以在宣告時初始化 //public readonly int readonlyTest=3; public static readonly int staticReadonlyTest; //同readonlyTest public Test() { readonlyTest = 3; //延遲到建構函式中初始化 } static Test() { staticReadonlyTest = 4; //延遲到建構函式中初始化 //注意:static變數在static建構函式中初始化 } } static void Main(string[] args) { Console.WriteLine("constTest is {0},staticReadonlyTest is {1}", Test.constTest, Test.staticReadonlyTest); Console.ReadLine(); } }</span>
相同點:
- const與readonly都是隻讀的.
- const預設是static的,而且在編譯期間已經解析完成.所以const與static readonly 只能由類來訪問,而readonly由例項來訪問.
不同點
- const既可以修飾類中的成員,又可以修飾函式體中的成員.而readonly只能修改類中的成員.
- const(靜態常量)只能宣告為簡單的資料型別,如int,浮點型,列舉,布林,字串型.而readonly(動態常量)可以修飾一下物件型別,如Datetime型別.
注意:
- const預設是靜態的,不能再static const!
- static readonly常量,如果要在建構函式中初始化其值,必須在靜態無參建構函式中初始化.
總結:
const是靜態常量,readonly是動態常量.const高效,readonly靈活!但實際開發中我們經常用static readonly 來代替const, 以平衡const在靈活性上的不足.