C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のconstキーワードとreadonlyキーワードの違いを説明する


C#では、constキーワードとreadonlyキーワードの両方を使用して、宣言された後は変更できない不変の値を定義します。ただし、2つの間にいくつかの重要な違いがあります。

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;
   }
}

読み取り専用フィールドは、フィールド宣言および任意のコンストラクターで複数回割り当てることができます。また、使用するコンストラクターに応じて異なる値を持つことができます。

2つの重要な違いは、あるアセンブリで宣言されたconstまたはreadonlyフィールドが、別のアセンブリで使用されたときにコンパイルされる場合です。

  • const値の場合、それはfind-replaceのようなものです。定数値は、2番目のアセンブリの中間言語に「焼き付けられます」。これは、定数を更新した場合、再コンパイルするまで2番目のアセンブリが最初の値を保持することを意味します。

  • 読み取り専用値の場合、これはメモリ位置への参照のようなものです。値は、2番目のアセンブリの中間言語にベイク処理されません。これは、メモリの場所が更新された場合、2番目のアセンブリが再コンパイルせずに新しい値を取得することを意味します。読み取り専用フィールドを更新すると、最初のアセンブリのみをコンパイルする必要があり、ユーザーアセンブリをコンパイルする必要はありません。

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

  1. const int *、const int * const、およびint const *の違いは何ですか?

    ここでは、整数ポインター、整数定数、および整数定数ポインターに基づくいくつかの異なるタイプの変数宣言を確認します。 それらを決定するために、時計回り/スパイラルルールを使用します。用語を話し合うことで、ルールも理解できます。 const int * 。これは、これがポインター型変数であることをコンパイラーに通知するために使用され、定数intのアドレスを格納できます。時計のルールはこのように言っています- もう1つはconstint*constです。これは、これが1つの定数ポインター変数であり、別の定数整数のアドレスを格納できることを示すために使用されます。時計のルールを適用する

  2. 文字列とC#の文字列の違いは何ですか?

    StringはSystem.Stringを表しますが、stringはSystem.StringのC#のエイリアスです- 例 string str = "Welcome!"; 必須ではありませんが、通常、クラスを操作するときに文字列が使用されます。 string str = String.Format("Welcome! {0}!", user); 文字列はSystemのエイリアスであるため。弦。他のデータ型のエイリアスは-です 例 object: System.Object string: System.String bool: System.Bo