Pourquoi ne puis-je pas disposer de & # 8220; chaîne publique statique statique S = & # 8221; " dans ma classe?
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?
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.