Perché non posso avere "public static const string S =" stuff "; nella mia classe?


321

Quando provo a compilare la mia classe ottengo un errore:

La costante 'NamespaceName.ClassName.CONST_NAME'non può essere contrassegnata come statica.

alla linea:

public static const string CONST_NAME = "blah";

Potrei farlo tutto il tempo in Java. Che cosa sto facendo di sbagliato? E perché non mi lascia fare questo?

Risposte:


583

Un constoggetto lo è sempre static.


2
const rende la variabile costante e non può essere modificata.
Samuel,

6
@jinguy: const significa intrinsecamente statico - se hai const, è già statico, e quindi statico non ha bisogno di essere né essere specificato.
John Rudy,

8
@jjnguy: Perché? in sola lettura è in realtà più flessibile del finale di Java per le variabili: puoi impostarlo tutte le volte che vuoi nel costruttore, ma non altrove. Questo può essere molto utile.
Jon Skeet,

67
I costi sono inline al momento della compilazione e non sono presenti nell'oggetto di tipo statico in fase di esecuzione. La statica non è incorporata e vive all'interno dell'oggetto type. Aggiungo questo solo perché nessuno ha menzionato la differenza ...

3
Sono ancora presenti al momento dell'esecuzione - puoi ottenerli con la riflessione, ad esempio (con GetField).
Jon Skeet,


32

Un membro const è considerato statico dal compilatore, così come implica una semantica di valore costante, il che significa che i riferimenti alla costante potrebbero essere compilati nel codice usando come valore del membro costante, anziché un riferimento al membro.

In altre parole, un membro const contenente il valore 10, potrebbe essere compilato in codice che lo utilizza come numero 10, anziché come riferimento al membro const.

Questo è diverso da un campo di sola lettura statico, che sarà sempre compilato come riferimento al campo.

Nota, questo è pre-JIT. Quando JIT'ter entra in gioco, potrebbe compilarli entrambi nel codice target come valori.


Punto molto importante, che il codice compilato presume che il valore costante non cambierà in una versione futura.
PJTraill,

6

C # constè esattamente la stessa cosa di Java final, tranne che è assolutamente sempre static. A mio avviso, non è davvero necessario che una constvariabile sia non- static, ma se è necessario accedere a una constvariabile non static-ly, è possibile fare:

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;
    }    
}

Bene, ora mi rendo conto che questa domanda è stata posta 4 anni fa, ma dato che ho impiegato circa 2 ore di lavoro, consistendo nel provare tutti i tipi di modi diversi di rispondere e di formattare il codice, in questa risposta, la sto ancora pubblicando. :)

Ma, per la cronaca, mi sento ancora un po 'sciocco.


4
Per quanto ne so, Java finalsi comporta esattamente come C # readonlye non è constaffatto.
Ben Voigt,

@jjnguy Grazie per la modifica; Non so davvero perché ho scelto quella formulazione originale.
Meowmaritus,

6

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

... Inoltre, mentre un campo const è una costante di compilazione , il campo di sola lettura può essere utilizzato per le costanti di runtime ...

Quindi usare static nei campi const è come provare a rendere statico definito (con #define) in C / C ++ ... Dato che viene sostituito con il suo valore in fase di compilazione, ovviamente viene avviato una volta per tutte le istanze (= statico) .


2

const è simile a static, possiamo accedere a entrambe le variabili con il nome della classe, ma diff è che le variabili statiche possono essere modificate e const non può.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.