回答:
const
オブジェクトは常にありますstatic
。
C#言語仕様 (PDFのページ287 -またはPDFの第300ページ)。
定数は静的メンバーと見なされますが、定数宣言は静的修飾子を必要とせず、許可もしません。
constメンバーはコンパイラーによって静的であると見なされ、定数値のセマンティクスを意味します。つまり、定数への参照は、メンバーへの参照ではなく、定数メンバーの値として使用コードにコンパイルされる可能性があります。
つまり、値10を含むconstメンバーは、constメンバーへの参照ではなく、数値10として使用するコードにコンパイルされる可能性があります。
これは、常にフィールドへの参照としてコンパイルされる静的な読み取り専用フィールドとは異なります。
これは事前JITであることに注意してください。JIT'terが機能するようになると、両方が値としてターゲットコードにコンパイルされる場合があります。
C#const
は、Javaとまったく同じですが、final
常に同じですstatic
。私の意見ではのために、それは本当に必要はありませんconst
変数が非であることをstatic
、しかし、あなたがアクセスする必要がある場合はconst
、変数非static
-lyを、あなたが行うことができます。
class MyClass
{
private const int myLowercase_Private_Const_Int = 0;
public const int MyUppercase_Public_Const_Int = 0;
/*
You can have the `private const int` lowercase
and the `public int` Uppercase:
*/
public int MyLowercase_Private_Const_Int
{
get
{
return MyClass.myLowercase_Private_Const_Int;
}
}
/*
Or you can have the `public const int` uppercase
and the `public int` slighly altered
(i.e. an underscore preceding the name):
*/
public int _MyUppercase_Public_Const_Int
{
get
{
return MyClass.MyUppercase_Public_Const_Int;
}
}
/*
Or you can have the `public const int` uppercase
and get the `public int` with a 'Get' method:
*/
public int Get_MyUppercase_Public_Const_Int()
{
return MyClass.MyUppercase_Public_Const_Int;
}
}
さて、私はこの質問が4年前に尋ねられたことに気付きましたが、私がこの回答にさまざまな種類の応答とコードの書式設定を試すことからなる約2時間の作業を費やしたので、私はまだそれを投稿しています。:)
しかし、記録としては、私はまだ少しばかげていると感じています。
final
はC#readonly
とまったく同じように動作し、まったく動作しませんconst
。
MSDNから:http : //msdn.microsoft.com/en-us/library/acdd6hb7.aspx
...また、constフィールドはコンパイル時の定数ですが、readonlyフィールドはランタイム定数に使用できます...
したがって、constフィールドでstaticを使用することは、C / C ++で定義された(#defineを使用して)staticにしようとするようなものです...もちろん、コンパイル時にその値に置き換えられるため、すべてのインスタンスに対して一度開始されます(= static) 。