1. 程式人生 > >const 與readonly區別

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>

 相同點:

  1.  const與readonly都是隻讀的.
  2.  const預設是static的,而且在編譯期間已經解析完成.所以const與static readonly 只能由類來訪問,而readonly由例項來訪問.

       不同點

  1. const既可以修飾類中的成員,又可以修飾函式體中的成員.而readonly只能修改類中的成員.
  2. const(靜態常量)只能宣告為簡單的資料型別,如int,浮點型,列舉,布林,字串型.而readonly(動態常量)可以修飾一下物件型別,如Datetime型別.

        注意:

  1.  const預設是靜態的,不能再static const!
  2.  static readonly常量,如果要在建構函式中初始化其值,必須在靜態無參建構函式中初始化.

總結:

       const是靜態常量,readonly是動態常量.const高效,readonly靈活!但實際開發中我們經常用static readonly 來代替const, 以平衡const在靈活性上的不足.