web-dev-qa-db-fra.com

Pourquoi ne puis-je pas avoir "chaîne statique publique constante S =" choses "dans ma classe?

En essayant de compiler ma classe, j'obtiens une erreur:

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 ça ne me laisse pas faire ça?

287
jjnguy

Un objet const est toujours static.

527
Joel Coehoorn

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

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

90
splattne

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 qui l'utilise comme numéro 10, au lieu d'une référence au membre const.

Ceci est différent 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 en tant que valeurs.

Le const de C # est exactement la même chose que le final de Java, sauf qu'il est absolument toujours static. À mon avis, il n'est pas vraiment nécessaire qu'une variable const soit non -static, mais si vous devez accéder à une variable const, non -static-, peut 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;
    }    
}

Bien, maintenant je réalise que cette question a été posée il y a 4 ans, mais depuis que 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 le compte rendu, je me sens toujours un peu bête.

6
Meowmaritus

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

... De même, alors que 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 lancé une fois pour toutes les instances (= statique) .

5
uriel

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 le peut pas.

2
soujanya