“ public static const string S =” stuff&quot ;;私のクラスで?
質問
クラスをコンパイルしようとするとエラーが発生します:
定数
'NamespaceName.ClassName.CONST_NAME'
は静的とマークできません。
行:
public static const string CONST_NAME = "blah";
これは常にJavaでできました。何が間違っていますか?そして、なぜそれが私にこれをさせないのですか?
解決
const
オブジェクトは常に static
です。
他のヒント
C#言語仕様から (PDF 287ページ-またはPDFの300ページ):
定数は考慮されますが 静的メンバー、定数 宣言は要求も 静的修飾子を許可します。
constメンバーは、コンパイラーによって静的であると見なされ、定数値の意味を暗示します。つまり、定数への参照は、メンバーへの参照ではなく、定数メンバーの値として使用コードにコンパイルされる場合があります。
つまり、値10を含むconstメンバーは、constメンバーへの参照ではなく、値10として使用するコードにコンパイルされる可能性があります。
これは、常にフィールドへの参照としてコンパイルされる静的な読み取り専用フィールドとは異なります。
これはpre-JITです。 JIT'terが登場すると、これらを値としてターゲットコードにコンパイルします。
C#の const
は、Javaの final
とまったく同じですが、絶対に常に static
である点が異なります。私の意見では、 const
変数が非 static
である必要はありませんが、 const
変数に非アクセスする必要がある場合、 static
-ly、you can do:
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時間の仕事をこの答えに入れたので、私はまだそれを投稿しています。 :)
しかし、記録のために、私はまだちょっとばかげていると感じています。
MSDNから: http://msdn.microsoft.com/en-us /library/acdd6hb7.aspx
...また、 constフィールドはコンパイル時の定数です、読み取り専用フィールドはランタイム定数に使用できます...
したがって、constフィールドでstaticを使用することは、C / C ++で(#defineを使用して)定義済みのstaticを作成しようとするようなものです。もちろん、コンパイル時に値に置き換えられるため、 = static)。
constはstaticに似ていますが、クラス名で両方の変数にアクセスできますが、diffはstatic変数を変更でき、constは変更できません。