クラスに「public static const string S =” stuff”;を含めることができないのはなぜですか?


321

クラスをコンパイルしようとすると、エラーが発生します。

定数'NamespaceName.ClassName.CONST_NAME'を静的としてマークすることはできません。

行で:

public static const string CONST_NAME = "blah";

私はいつでもJavaでこれを行うことができました。何が悪いのですか?そして、なぜ私にこれをさせないのですか?

回答:


583

constオブジェクトは常にありますstatic


2
constは変数を定数にし、変更できません。
サミュエル

6
@jinguy:constは本質的に静的を意味します-constがある場合、それはすでに静的なので、staticを指定する必要はなく、指定することもできません。
ジョンルディ、

8
@jjnguy:なぜ?readonlyは実際にはJavaの最終的な変数よりも柔軟性があります。コンストラクターで何度でも設定できますが、他の場所では設定できません。これは非常に便利です。
Jon Skeet、

67
定数はコンパイル時にインライン化され、実行時に静的型オブジェクトには存在しません。スタティックはインライン化されておらず、タイプオブジェクト内にあります。誰も違いを述べていないので、これを追加します...

3
それらはまだ実行時に存在します-たとえば、(GetFieldを使用して)リフレクションでそれらに到達できます。
Jon Skeet、


32

constメンバーはコンパイラーによって静的であると見なされ、定数値のセマンティクスを意味します。つまり、定数への参照は、メンバーへの参照ではなく、定数メンバーの値として使用コードにコンパイルされる可能性があります。

つまり、値10を含むconstメンバーは、constメンバーへの参照ではなく、数値10として使用するコードにコンパイルされる可能性があります。

これは、常にフィールドへの参照としてコンパイルされる静的な読み取り専用フィールドとは異なります。

これは事前JITであることに注意してください。JIT'terが機能するようになると、両方が値としてターゲットコードにコンパイルされる場合があります。


非常に重要な点は、コンパイルされたコードは定数値が将来のバージョンで変更されないことを想定していることです。
PJTraill、2015

6

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時間の作業を費やしたので、私はまだそれを投稿しています。:)

しかし、記録としては、私はまだ少しばかげていると感じています。


4
私の知る限り、Java finalはC#readonlyとまったく同じように動作し、まったく動作しませんconst
Ben Voigt 2014年

@jjnguy編集ありがとうございます。なぜそのオリジナルの言葉遣いを選んだのか本当にわかりません。
Meowmaritus 14

6

MSDNから:http : //msdn.microsoft.com/en-us/library/acdd6hb7.aspx

...また、constフィールドはコンパイル時の定数ですが、readonlyフィールドはランタイム定数に使用できます...

したがって、constフィールドでstaticを使用することは、C / C ++で定義された(#defineを使用して)staticにしようとするようなものです...もちろん、コンパイル時にその値に置き換えられるため、すべてのインスタンスに対して一度開始されます(= static) 。


2

constはstaticに似ており、クラス名で両方の変数にアクセスできますが、diffは静的変数を変更でき、constは変更できません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.