在 C# 中,const 和 readonly 關鍵字都用來定義不可變值,這些值一旦宣告就無法修改。但是,兩者之間存在一些重要的差異。
const 修飾符宣告在編譯時已知且不會變更的常數值,即它們是不可變的。在 C# 中,只能將內建類型標記為 const。使用者定義的類型(例如類別、結構體等)不能是 const。此外,類別成員類型(例如方法、屬性或事件)不能標記為常數。
您必須在宣告期間初始化常數。
class Period{ public const int hours = 12; public const int minutes = 60; }
常數可以用任何可見性修飾符標記,即私有、公有、受保護、受保護的內部或私有受保護。
常數也充當靜態值,即常數的值與該類別的所有實例。您不必使用 static 關鍵字明確標記它們。您無法使用該類別的實例變數存取常數,而必須使用類別名稱。
標記為唯讀的欄位只能在宣告或在建構子中。一旦建立了類別的實例,就無法修改唯讀欄位。
如果該欄位是值類型,則將其標記為唯讀會使其不可變。另一方面,如果只讀欄位是引用類型,那麼您仍然可以更改變數引用的物件的資料。但是,您無法變更該引用以指向新物件。
class Person{ private readonly string _title; private readonly string _skill; public Person(string title, string skill){ _title = title; _skill = skill; } }
只讀欄位可以在欄位宣告和任何建構函式中多次賦值。此外,根據所使用的建構函數,它可以具有不同的值。
兩者之間的一個重要差異是,在一個程式集中宣告的 const 或 readonly 欄位在另一個程式集中使用時會被編譯。
對於 const 值,它就像尋找替換。此常數值被「烘焙」到第二個程式集的中間語言。這意味著,如果您更新常數,第二個組件仍將具有第一個值,直到您重新編譯它為止。
對於唯讀值,它就像一個引用到一個記憶體位置。該值不會嵌入到第二個組件的中間語言中。這意味著如果記憶體位置被更新,第二個組件無需重新編譯即可取得新值。更新只讀欄位意味著只需要編譯第一個組件,而無需編譯任何使用者組件。
即時示範
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
以上是解釋C#中const和readonly關鍵字的差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!