1. ホーム
  2. c#

[解決済み] C#のconstとreadonlyの違いは何ですか?

2022-03-16 06:26:01

質問

とはどのような違いがあるのでしょうか? const readonly をC#で使うのですか?

どのような場合にどちらを使うのでしょうか?

どのように解決するのですか?

という見かけ上の違いは別として

  • の定義時に値を宣言しなければなりません。 const VS readonly 値は動的に計算されますが、コンストラクタが終了する前に代入する必要があります。
  • const は暗黙のうちに static . を使用します。 ClassName.ConstantName という表記でアクセスします。

微妙な違いがあるのです。で定義されたクラスを考えてみましょう。 AssemblyA .

public class Const_V_Readonly
{
  public const int I_CONST_VALUE = 2;
  public readonly int I_RO_VALUE;
  public Const_V_Readonly()
  {
     I_RO_VALUE = 3;
  }
}

AssemblyB 参考文献 AssemblyA で、これらの値をコードで使用します。これがコンパイルされると

  • の場合 const の値は、find-replaceのようなものです。 値2が AssemblyB のILです。これはつまり、明日私が I_CONST_VALUE を20に変更します。 AssemblyB リコンパイルするまで、まだ2つあります。 .
  • の場合は readonly の値のようなものです。 ref をメモリロケーションにコピーします。に値を焼き付けるのではありません。 AssemblyB のILになります。つまり、メモリ位置が更新されると AssemblyB はリコンパイルせずに新しい値を取得します。そのため、もし I_RO_VALUE が 30 に更新された場合、ビルドする必要があるのは AssemblyA であり、すべてのクライアントを再コンパイルする必要はありません。

そのため、定数の値が変わらないという自信がある場合は const .

public const int CM_IN_A_METER = 100;

しかし、変化する可能性のある定数(例:精度の変化)がある場合、あるいは疑問がある場合には readonly .

public readonly float PI = 3.14;

Update: Akuが最初にこれを指摘したので、言及される必要があります。また、これをどこで知ったかを書いておく必要があります。 エフェクティブC# - ビルワグナー