373 votes

Pourquoi ne puis-je pas avoir "public static const string S = "stuff" ; dans ma classe ?

Lorsque j'essaie de compiler ma classe, j'obtiens une erreur :

La constante 'NamespaceName.ClassName.CONST_NAME' ne peuvent pas être marqués comme statiques.

à la ligne :

public static const string CONST_NAME = "blah";

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

669voto

Joel Coehoorn Points 190579

A const est toujours static .

2 votes

Const rend la variable constante et ne peut être modifiée.

7 votes

@jinguy : const signifie intrinsèquement static -- si vous avez un const, il est déjà static, et static n'a donc pas besoin d'être et ne peut pas être spécifié.

1 votes

Je ne pense pas que le C# ait un analogue direct à "final".

113voto

splattne Points 48126

De la Spécification du langage C# (PDF page 287 - ou 300ème page du PDF) :

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

2 votes

37voto

Lasse V. Karlsen Points 148037

Un membre constant est considéré comme statique par le compilateur, et implique une sémantique de valeur constante, ce qui signifie que les références à la constante peuvent être compilées dans le code utilisateur comme la 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 le nombre 10, au lieu d'une référence au membre const.

C'est différent d'un champ statique en lecture seule, qui sera toujours compilé comme une référence au champ.

Notez que c'est du pré-JIT. Lorsque le JIT'ter entrera en jeu, il pourra compiler ces deux éléments dans le code cible en tant que valeurs.

0 votes

Point très important, le code compilé suppose que la valeur de la constante ne changera pas dans une version future.

8voto

user1890257 Points 31

C# const est exactement la même chose que la méthode Java final sauf que c'est absolument toujours static . À mon avis, il n'est pas vraiment nécessaire pour un const variable à être non static mais si vous avez besoin d'accéder à une const variable non static -ly, vous pouvez le 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;
    }    
}

Je me rends compte 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 quand même :)

Mais, pour info, je me sens toujours un peu bête.

5 votes

D'après ce que je sais, Java final se comporte exactement comme le C# readonly et non comme const du tout.

0 votes

@jjnguy Merci pour la modification ; je ne sais pas vraiment pourquoi j'ai choisi cette formulation originale.

7voto

uriel Points 133

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

... Aussi, alors que un champ const est une constante de compilation le champ en lecture seule peut être utilisé pour les constantes d'exécution...

Ainsi, utiliser static dans les champs const revient à essayer de rendre statique un champ défini (avec #define) en C/C++... Puisqu'il est remplacé par sa valeur au moment de la compilation, il est bien sûr lancé une fois pour toutes les instances (=static).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X