c#.net中const和readonly的區別

來源:互聯網
上載者:User
(1) readonly和const都是用來標示常量的。
(2) 初始化賦值不同。
const修飾的常量必須在聲明的同時賦值。例如:

public class Class1  {      public const int MaxValue = 10;       //正確聲明      public const MInValue;                   //錯誤:常量欄位要求提供一個值      public Class1()      {          MinValue = 10;      }  }

readonly欄位可以在初始化(聲明或建構函式)的過程中賦值。因此,根據所使用的建構函式,readonly欄位可能具有不同的值。

public class Class1  {      public readonly int c = 10;           //正確聲明      public readonly int z;      public Class1()      {          z = 24;//正確      }      protected void Load()      {          z = 24;//錯誤:無法對唯讀欄位賦值(建構函式或變數初始值指定項中除外)      }  }

readonly是執行個體成員,所以不同的執行個體可以有不同的常量值,這是readonly更靈活。

public readonly Color Red = new Color(255, 0, 0);  public readonly Color Green = new Color(0, 255, 0);  public readonly Color Blue = new Color(0, 0, 255);

(3) const欄位是編譯時間常數,而readonly欄位可用於運行時常數。
const要求編譯器能夠在編譯時間計算出確定的值。在編譯的時候,用計算出的這個確定的值去替換調用該常量的每一個地方。因此不能從一個變數中提取值來初始化常量。
readonly允許把一個欄位設定成常量,但可以執行一些運算,可以確定它的初始值。因為readonly是在計算時執行的,所以可以用某些變數初始化。在運行時才確定的該值。
(4) const預設就是靜態,而readonly如果設定成靜態就必須顯示聲明。
(5) const修飾的值的類型也有限制,它只能為下列類型之一(或能夠轉換為下列類型):sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、enum類型或參考型別。注意能夠聲明為const的參考型別只能為string或值為null的其他參考型別。readonly可以是任何類型。
這就是說,當我們需要一個const的常量時,若他的類型限制了它不能再編譯時間被計算出確定的值來,那麼我們可採取將之聲明為static readonly的方式來解決。但兩者之間還是有一點細微的差別的。看下面兩個不同的檔案。
file1.cs

using System;  namespace MyNamespace1  {      public class MyClass1      {          public static readonly int myField = 10;      }  }


file2.cs

namespace MyNamespace2  {      public class MyClass1      {          public static void Main()          {              Console.WriteLine(MyNamespace1.MyClass1.myField);          }      }  }

兩個類分屬於兩個檔案file1.cs和file2.cs,並分開編譯。在檔案file1.cs內的域myField聲明為static readonly時,如果我們由於某種需要將myField的值改為了20,那麼我們只需要重新編譯檔案file1.cs為file1.dll,在執行file2.exe時即會得到20。
但如果將static readonly改變為const後,再改變myField的初始化值時,我們則必須重新編譯所有引用到file1.dll的檔案,否則我們引用的MyNamespace1.MyClass1.myField將不會如我們所願而改變。這在大的系統開發過程中尤其需要注意。
(6) object、Array(數組)和struct(結構)不能被聲明為const常量。

以上就是c#.net中const和readonly的區別的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.