2013-09-02 14 views
15

私は質問があります。最近私は3つの異なるコード行を使用して自分自身を捕まえました。constとreadonlyとstaticクラスの違いは何ですか

public static class constant 
{ 
    public static readonly int val1 = 5; 
    public const int val2 = 5; 
    public static int val3 { get { return 5; } } 
} 

私の質問は同じですか、別のものを使用する必要がありますか?もしそうなら。いつ?

また、ビジュアルスタジオで余分な質問として、なぜそれらはすべてインテリセンスで異なって表されていますか? CONSTができないのに対し、静的読み取り専用constroctorに割り当てることができる

enter image description here

答えて

6

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):

定数と読み取り専用フィールドには、異なるバイナリバージョン管理 意味を持っています。式が定数を参照する場合、コンパイル時に 定数の値が取得されますが、式 が読み取り専用フィールドを参照する場合、実行時までフィールドの値は になりません。

一見したところで見た目が似ていても、あなたの意図に最も適したものを使用しても、それらは合計されています。

0

。また、ゲッターは定数値を返す必要はなく、値vanはクラスの別の部分で変更することができる専用メンバーでも、計算値でもかまいません。 readonly (C# Reference)

から

は読み取り専用キーワードはconstキーワードは異なっています。 const フィールドは、フィールドの宣言でのみ初期化できます。 readonlyフィールドは、宣言または コンストラクターで初期化できます。したがって、readonlyフィールドは、使用されるコンストラクタに応じて異なる値 を持つことができます。 constのフィールドが コンパイル時定数である一方、また、読み取り専用フィールドには、次の例のように、実行時のために 定数を使用することができます。

public static readonly uint timeStamp = (uint)DateTime.Now.Ticks; 

読み取り専用キーワードが修飾されていることができますフィールドで使用します。 のフィールド宣言にreadonly修飾子が含まれている場合、宣言によって導入された フィールドへの割り当ては、 宣言の一部として、または同じクラスのコンストラクターでのみ発生する可能性があります。

const (C# Reference)

からconstキーワードは、フィールドまたはローカル 変数の宣言を変更するために使用されます。フィールドの値またはローカルの 変数の値が一定であることを指定します。つまり、変更できません。彼らは別のコンパイル時間あるよう

はまた、インクルードはインテリセンスに異なっているときにいつでもできますが、constアリのフィールドを使用する必要があります

+1

これは質問に答えません。 – AgentFire

0

オブジェクト - しかし、これはプリミティブ型に対してのみ機能します。

カスタムタイプ(独自のクラスまたは構造体など)が必要な場合は、public static propertyを使用してください。

パブリックフィールドは構造体でのみ使用されており、パブリックな静的な読み取り専用フィールドを見た場合は思い出せません。

+0

'string.Empty'は' public static readonly'フィールドです。 –

+0

'Type.Missing'' Type.EmptyTypes'など多くの公開静的読み取り専用フィールドの例です。 –

0

constまたはreadonlyをフィールド定義に使用すると、 const修飾子は、primitive dataの型と文字列でのみ使用できます。使用する場合、constフィールドに割り当てられた値は、生成されたILコードのすべての参照に直接挿入されます。他のアセンブリについても同様です。そのconstフィールドを参照する他のアセンブリは、値自体を直接使用したかのようにコンパイルされます。読み取り専用フィールドは実行時定数です。それらはメモリ内のいくつかの場所を占めており、通常の変数を参照したかのように、実行時に参照が解決されます。実際、それらは定数に似た変数です。原則として

const:

、定数を回避しようとすると、値は、それらが宣言されているアセンブリにハードコードされただけでなく、同様に一定の値を参照するアセンブリにだけではないからです。これはいくつかの本当の奇妙な問題を作り出すことができます。

  • 静的にすることはできません。
  • 値はコンパイル時に評価されます。
  • 宣言時にのみ開始されます。

readonly:

  • インスタンスレベルまたは静的のいずれかになります。
  • 値は実行時に評価されます。
  • コンストラクタで宣言またはコードで初期化できます。
0

Constは、コンパイル時に評価される式です。コンパイラは、その値が使用されているすべての場所に直接値を埋め込むことができます。静的読み取り専用は実行時にのみ評価され、コンパイルされたアセンブリが静的読み取り専用値を持たないため、後で値が変更される可能性がある場合に便利です。 DateTime.Nowのようないくつかの値は、実行時に行わなければならないプロパティの評価のため、constに格納することはできません。静的読み取りのみを使用できます。これはconstと似ていますが、実行時に値を取得します。

最終的なものは、単なる値を返す以上のことを行うことができるプロパティです。これは、Webサービス呼び出しまたは複雑な計算の結果である可能性があります。プロパティのコードはコンパイラによってinlinedになることがあります。

どちらを使用するかは、必要なセマンティクスによって異なります。

0

こんにちは、あなたがこの記事では、あなたの質問のための答えを見つける:

Static readonly vs const

また、ILコードをチェックして、あなたの自己によって結果を比較しようとすることができます。

+2

Visual Studioのアイコンとgetの例については説明していません –

0

私はあなたの最初の質問を説明します。

Const;コンパイル時にメンバーに初期値を与えてから、変更することはできません。静的な読み取り専用。メンバの値を初期化するように割り当てる必要はなく、割り当てられる必要があります。任命後は一度変更することはできません。

静的読み取り専用メンバーは、属しているクラス内からアクセスでき、値を割り当てることができます。メンバーの値を割り当てる値の最初の割り当てを行うか、静的コンストラクターをトランザクション内で行う必要があります。

関連する問題