首頁  >  文章  >  後端開發  >  解釋C#中const和readonly關鍵字的差別

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

WBOY
WBOY轉載
2023-09-15 16:33:021040瀏覽

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

在 C# 中,const 和 readonly 關鍵字都用來定義不可變值,這些值一旦宣告就無法修改。但是,兩者之間存在一些重要的差異。

const

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中文網其他相關文章!

    陳述:
    本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除