readonlyとして宣言されたメンバは、クラスの(静的な)コンストラクタで変更される可能性がありますが、実行時にconstメンバを変更することはできません。
CONSTは§10.3.7から引用、それは自動的に静的になり、フィールドの宣言:
フィールド、メソッド、プロパティ、イベント、オペレータ、またはコンストラクタ 宣言がstatic修飾子を含む場合、それが宣言静的メンバー さらに、定数または型の宣言では、暗黙的に静的メンバー が宣言されます。
第三は、常にあなたは、コンパイラおよび/またはジッタを可能にするために、このようなプロパティを使用していないし、可能な場合はconstのメンバーを好むん5.
を返すために起こるだけで読み取り専用のプロパティです最適化を実行し、他の人があなたのコードを読むのを助けます(そのプロパティは私にとっては一種のWTFです)。静的読み取り専用メンバーは、プログラムの起動時に(たとえば、マシンのコア数のように)一定の値を初期化する必要がある場合に使用する必要があります。
これはC#の仕様(§10.5.2.1)から良い例である:
静的読み取り専用フィールドが一定 値の記号名が望まれる場合に有用であるが、ときの種類値が const宣言で許可されていないか、値が コンパイル時に計算できない場合。それらの値は、コンパイル時に計算することができないので、たとえば
public class Color
{
public static readonly Color Black = new Color(0, 0, 0);
public static readonly Color White = new Color(255, 255, 255);
public static readonly Color Red = new Color(255, 0, 0);
public static readonly Color Green = new Color(0, 255, 0);
public static readonly Color Blue = new Color(0, 0, 255);
private byte red, green, blue;
public Color(byte r, byte g, byte b) {
red = r;
green = g;
blue = b;
}
}
では黒、白、赤、緑、青のメンバーは のconstメンバとして宣言することはできません。 しかし、代わりに静的なreadonlyを宣言すると、ほとんど同じ 効果があります。
そして、さらに別の差(§10.5.2.2):
定数と読み取り専用フィールドには、異なるバイナリバージョン管理 意味を持っています。式が定数を参照する場合、コンパイル時に 定数の値が取得されますが、式 が読み取り専用フィールドを参照する場合、実行時までフィールドの値は になりません。
一見したところで見た目が似ていても、あなたの意図に最も適したものを使用しても、それらは合計されています。
これは質問に答えません。 – AgentFire