8

const今日、フィールドはコンパイル時定数と呼ばれ、readonlyフィールドはランタイム定数と呼ばれる記事を見つけました。2つのフレーズは《Effective C#》から来ています。MSDN と言語仕様で検索しましたが、runtime constantについては何も見つかりませんでした。

攻撃的ではありませんが、ランタイム定数は適切なフレーズではないと思います。

private readonly string foo = "bar";

は、値が「bar」で、値が読み取り専用の「foo」という名前の変数を作成します。ここでは変数であり、constant. 読み取り専用変数は依然として変数であり、定数にすることはできません。変数と定数は相互に排他的です。

この質問は行き過ぎかもしれませんが、それでも他の人の意見を聞きたいです。どう思いますか?

4

5 に答える 5

10

著者は次のことを意味すると思います。

例を考えてみましょう:

public class A {

     public const int a = Compute();         

     private static int Compute(){

          /*some computation and return*/ 
          return some_computed_value;
     }
}

に割り当てるには定数値が必要なため、これはコンパイルされませんa。つまり、これはコンパイル時定数の意味です。

代わりに、これをに変更すると

public class A {

     public readonly int a = Compute();          

     private static int Compute(){
          /*some computation and return*/ 
          return some_computed_value;
     }
}

これコンパイルされます。実行時に計算を行い、に割り当てaます。これは実行時定数の意味です

于 2012-07-04T06:49:42.307 に答える
6

ご指摘のとおり、その用語は言語仕様などでは使用されていません。その本のせいだ!ここでの「読み取り専用」の定義は初期化子/コンストラクターに関連しており、通常のコードに限定されているため、それを「読み取り専用フィールド」と呼びます。たとえば、読み取り専用フィールドでさえ変更可能です...

// how to annoy your colleagues...
typeof(string).GetField("Empty").SetValue(null, " ");

(これは最近の CLR バージョンでは機能しなくなったことに注意してください。JIT はおそらくフィールド ロードを ldstr に置き換えますが、実際には非常に長い間機能していました)

(オブジェクトでこれを行うより純粋な理由は、逆シリアル化に関連しています)

于 2012-07-04T06:43:48.747 に答える
2

readonly 変数は、そのコンストラクターでのみ変更でき、複雑なオブジェクトで使用できます。定数変数は実行時に変更できませんが、Int、Double、String などの単純な型でのみ使用できます。ランタイム定数はある程度正確ですが、問題を混乱させます。定数と読み取り専用の間には非常に明白な違いがあります。そのため、同じ目的で使用されることが多いにもかかわらず、同じような名前を付けることはおそらく良い考えではありません。

ここでの違いの簡単な要約

于 2012-07-04T06:39:44.000 に答える
2

readonly を「write once variable」と呼びます。これは、実行時ではなく、コンパイラによってチェックされます。リフレクションを使用してフィールドを書き込むことができるため、実行時に一定ではありません。

于 2012-07-04T06:41:31.917 に答える