Question

Pourquoi C # n'autorise-t-il pas const et static sur la même ligne? En Java, vous devez déclarer un champ comme "statique" et "final" pour agir en tant que constante. Pourquoi C # ne vous laisse pas déclarer que const est final?

Je fais en outre la distinction. En Java, chaque interface est publique et abstraite, qu'elle soit explicitement déclarée ou non. Les const ne sont-ils pas réellement de nature statique? POURQUOI C # hésite-t-il à cela?

Était-ce utile?

La solution

const et statique signifient vraiment différentes choses, différents mécanismes de stockage, différentes initialisations. static est en lecture / écriture. Par conséquent, la mémoire doit être allouée pour le stockage et doit être initialisée à l'exécution. Un statique peut être initialisé avec une valeur littérale ou une expression. En revanche, un const est immuable et doit être initialisé avec une constante de compilation (généralement une valeur littérale ou une expression pouvant être entièrement évaluée au moment de la compilation). La valeur est connue au moment de la compilation, elle peut donc être incorporée directement dans le code généré. Par conséquent, aucun stockage n’est alloué à l’exécution.

Autres conseils

De par leur nature, les constantes sont statiques, donc ce serait redondant.

Comme indiqué précédemment, static final en Java est identique à static en lecture seule en C #. En fait, vous dites que ce membre est statique et que son contenu ne peut pas être modifié. Vous pouvez également spécifier dans les deux cas la valeur du constructeur statique.

Mais const en C # est une chose complètement différente. Cela ressemble davantage à des constantes dans C (directives DEFINE ), mais en gardant à l'esprit la POO. C'est statique parce que c'est constant - chaque instance aurait cette constante avec la même valeur, aucun constructeur ne peut la définir. Il est également possible que quelqu'un souhaite accéder à la constante sans avoir à créer d'instance. Quand on y pense, la constante non statique n'a pas de sens. Vous pouvez presque dire que les constantes ne font pas partie d'un objet - elles l'utilisent simplement pour fournir un contexte, un nom fort.

Java n'a pas l'équivalent de const . Vous pouvez lire quelque part que statique final est équivalent à DÉFINIR , mais c'est tellement vague. Mécanisme complètement différent, rien de commun, mais le résultat final dans le code est identique: une maintenance et une lisibilité du code meilleures.

Vous devez simplement cesser de penser aux constantes en C # en tant que membres statiques, car elles ne le sont pas. Considérez-les comme une version OOP de DEFINE . Lorsque vous envisagez l’encapsulation, la seule raison pour les champs final et en lecture seule est d’empêcher votre propre code de modifier accidentellement sa valeur. Et cela ne me semble pas constant.

Résumé:

  • final = en lecture seule
  • static final = static readonly
  • N / A = const

Il est vrai qu'un C # const implique static MAIS, C # a un équivalent du mot clé final de Java dans le mot clé en lecture seule .

Ainsi, en fait, C # autorise un const final , il est en lecture seule en C #.

Parce que permettre et ne pas avoir besoin de modificateurs inhérents peut causer de la confusion. Si vous voyez

static const int A = 3
const int B = 5

vous pouvez croire qu’il s’agit de 2 types différents de constantes.
Même VB 2008 (qui peut être très prolixe si vous le souhaitez) ne le permet pas.

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