Pourquoi ne puis-je pas disposer de & # 8220; chaîne publique statique statique S = & # 8221; " dans ma classe?

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

  •  03-07-2019
  •  | 
  •  

Question

Lorsque j'essaie de compiler ma classe, un message d'erreur s'affiche:

  

La constante 'NamespaceName.ClassName.CONST_NAME' ne peut pas être marquée comme statique.

à la ligne:

public static const string CONST_NAME = "blah";

Je pourrais le faire tout le temps en Java. Qu'est-ce que je fais mal? Et pourquoi ne me laisse-t-il pas faire cela?

Était-ce utile?

La solution

Un objet const est toujours statique .

Autres conseils

Extrait de la spécification du langage C # (PDF page 287 - ou 300e page du PDF):

  

Même si les constantes sont considérées   membres statiques, une constante   déclaration ne nécessite ni   permet un modificateur statique.

Un membre const est considéré comme statique par le compilateur et implique également une sémantique de valeur constante, ce qui signifie que les références à la constante peuvent être compilées dans le code utilisateur en tant que valeur du membre constant, au lieu d’une référence au membre.

En d’autres termes, un membre const contenant la valeur 10 pourrait être compilé dans un code l’utilisant comme numéro 10, au lieu d’une référence au membre const.

Cela diffère d'un champ statique en lecture seule, qui sera toujours compilé en tant que référence au champ.

Notez que ceci est pré-JIT. Lorsque le JIT'ter entre en jeu, il peut les compiler dans le code cible sous forme de valeurs.

Le const de C # est exactement identique au final de Java, sauf qu'il est absolument toujours statique . À mon avis, il n'est pas vraiment nécessaire qu'une variable const soit non statique , mais si vous devez accéder à une variable const , static -ly, vous pouvez faire:

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

Eh bien, je réalise maintenant que cette question a été posée il y a 4 ans, mais comme j'ai mis environ 2 heures de travail, consistant à essayer toutes sortes de façons différentes de répondre et de formater le code, dans cette réponse, je la poste toujours. . :)

Mais pour mémoire, je me sens toujours un peu idiot.

À partir de MSDN: http://msdn.microsoft.com/en-us /library/acdd6hb7.aspx

... De même, si un champ const est une constante de compilation , le champ en lecture seule peut être utilisé pour les constantes d'exécution ...

Donc, utiliser static dans les champs const revient à essayer de rendre statique (avec #define) défini en C / C ++ ... Puisqu'il est remplacé par sa valeur dans compile-time, il est bien sûr initialisé une fois pour toutes les instances ( = statique).

const est similaire à static, nous pouvons accéder aux deux variables avec le nom de la classe, mais diff est statique. Les variables statiques peuvent être modifiées et const ne peut pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top