程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> const和readonly的區別

const和readonly的區別

編輯:C#入門知識

  1. readonly和const都是用來標識常量的。
  2. 初始化值不同
      const修飾的常量必須在聲明的同時賦值。
      readonly字段可以在初始化(聲明或構造函數)的過程中賦值。在其它地方不能賦值,否則編譯器報錯。因此根據所使用的構造函數,readonly字段可能具有不同的值。
      readonly是實例成員,所以不同的實例可以有不同的常量值,這使readonly更靈活。
    1. const字段是編譯時常量,而readonly字段可用於運行時常量。
      constf聲明的常量,在編譯的時候,用計算出的這個確定的值去替換調用該常數的每個地方。如:
        public const int n = 1;
        public const int m = n + 1;//正確
        public const int a;
        public const int b = a + 1;//錯誤,a是一個變量,顯然不能在編譯時計算結果
      注意:程序中調用const聲明的n,在編譯後產生的中間語言代碼中,是用1來進行替換的。如果想讓n=2,則需要將當前類庫重新編譯一下,否則調用n的地方還是1。

      readonly允許把一個字段設置成常量,但可以進行一些運算,來確定它的初始化值。因為readonly是在計算時執行的,所以可以用某些變量初始化,在運行時才確定該值。例如:
       
    1. 01
    class Person 02 { 03     public readonly uint nowtime = (uint)DateTime.Now.Ticks; 04 } 05 class Program 06 { 07     static void Main(string[] args) 08     { 09         Person p = new Person(); 10         Console.WriteLine(p.nowtime); 11         Console.ReadKey(); 12     } 13 }
  1. const默認是靜態的,而readonly如果設置成靜態的就必須顯示聲明。
  2. const修飾的值類型是有限制的,object、Array(數組)和struct(結構)不能聲明為const常量。readonly可以是任何類型。
      這就是說,當我們需要一個const常量時,若它的類型限制了它不能在編譯時被計算出確定的值來,那麼我們可以采取將它聲明為static readonly的方式來解決。但兩者之間有一點細微的差別:由於const字段是編譯時常量,而readonly字段可用於運行時常量。所以,如果在一個文件中引用另一個文件中使用const聲明的常量,當對該常量的值進行了修改時,則需要重新編譯所有和該常量關聯的文件;而如果這個常量是使用static readonly聲明的,則只需編譯初始化該常量的文件卻可。
      看看下面的const和static readonly是否可以互換:
      1)static readonly Class1 c1 = new Class1();//不可以換成const。new操作符是要執行構造函數的,所以無法在編譯期間確定。const必須在聲明的同時賦值。
      2)static readonly Class1 c1 = null;//可以換成const。能夠聲明為const的引用類型只能為string或值為null的引用類型。
      3)static readonly a = b * 20;
          static readonly b = 10;//可以換成const
      4)static readonly int[] array = new int[] {1,2,3};//不能換成const,道理和1)一樣。
      5)void SomeFunction()
          {
              const int a = 10;//不能換成readonly。readonly只能用來修飾類的field,而不能修飾局部變量,也不能修飾property等其它類成員。
          }
     
    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved