解釋C#中const和readonly關鍵字的區別


在C#中,const和readonly關鍵字都用於定義不可變的值,一旦宣告就不能修改。但是,兩者之間存在一些重要的區別。

const

const修飾符宣告在編譯時已知的常量值,並且不會改變,即它們是不可變的。在C#中,你只能將內建型別標記為const。使用者定義的型別(例如類、結構體等)不能是const。此外,類成員型別(例如方法、屬性或事件)也不能標記為常量。

必須在宣告期間初始化常量。

class Period{
   public const int hours = 12;
   public const int minutes = 60;
}

常量可以標記任何可見性修飾符,即private、public、protected、protected internal或private protected。

常量也充當靜態值,即常量的值對於類的所有例項都是相同的。不必用static關鍵字顯式標記它們。不能使用該類的例項變數訪問常量,而必須使用類名。

readonly

標記為readonly的欄位只能在宣告期間或在建構函式中賦值。一旦建立了類的例項,就不能修改readonly欄位。

如果欄位是值型別,則將其標記為readonly使其不可變。另一方面,如果readonly欄位是引用型別,則你仍然可以更改變數引用的物件的資料。但是,你不能更改該引用以指向一個新物件。

class Person{
   private readonly string _title;
   private readonly string _skill;
   public Person(string title, string skill){
      _title = title;
      _skill = skill;
   }
}

可以在欄位宣告和任何建構函式中多次賦值readonly欄位。此外,它可以根據所使用的建構函式具有不同的值。

兩者之間的一個重要區別是在一個程式集中宣告的const或readonly欄位在另一個程式集中編譯時的情況。

  • 對於const值,它就像查詢替換一樣。常量值被“嵌入”到第二個程式集的中間語言中。這意味著如果你更新了常量,第二個程式集仍然會保留第一個值,直到你重新編譯它。

  • 對於readonly值,它就像對記憶體位置的引用。該值不會嵌入到第二個程式集的中間語言中。這意味著如果更新了記憶體位置,第二個程式集無需重新編譯即可獲得新值。更新readonly欄位意味著只需要編譯第一個程式集,而不需要任何使用者程式集進行編譯。

示例

 線上演示

using System;
class Program{
   static void Main(){
      Console.WriteLine(Period.HOURS);
      var person = new Person("John", "Programmer");
      person.Print();
   }
}
class Period{
   public const int HOURS = 12;
   public const int MINUTES = 60;
}
class Person{
   private readonly string _title;
   private readonly string _skill;
   public Person(string title, string skill){
      _title = title;
      _skill = skill;
   }
   public void Change(string skill){
      // Error: A readonly field cannot be assigned to
      // this._skill = skill;
   }
   public void Print(){
      Console.WriteLine($"{_title}: {_skill}");
   }
}

輸出

12
John: Programmer

更新於:2021年5月19日

681 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.