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

StackOverflow https://stackoverflow.com/questions/408192

  •  03-07-2019
  •  | 
  •  

Domanda

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 permette di farlo?

È stato utile?

Soluzione

Un oggetto const è sempre statico .

Altri suggerimenti

Dalla Specifica del linguaggio C # (PDF pagina 287 - o 300a pagina del PDF):

  

Anche se le costanti sono considerate   membri statici, una costante   la dichiarazione non richiede né   consente un modificatore statico.

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 compilare entrambi questi nel codice target come valori.

const const di C # è esattamente la stessa cosa del final di Java, tranne per il fatto che è sempre sempre static . A mio avviso, non è davvero necessario che una variabile const non sia statica , ma se è necessario accedere a una variabile const non- statico -ly, puoi 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 messo circa 2 ore di lavoro, consistendo nel provare ogni sorta 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.

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 statico in 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 ( = statica).

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top