8
votes

Déclarant une variable locale en tant que const

Clairement, déclarant une variable locale comme const , empêche la modification d'exécution. Const Les variables d'instance sont statiques (je crois). Cela a-t-il une incidence sur la nature et l'utilisation de variables locales const ? (E.G. Filetage)


1 commentaires

Vous feriez bien de lire la section 10.4 de la spécification C # si vous souhaitez la caractérisation définitive de champs constants. Il semble y avoir une bonne quantité de désinformation et de ce que dans les différentes réponses ici.


7 Réponses :


3
votes

Étant donné que chaque méthode appelle crée sa propre zone de pile et possède donc ses propres variables locales, vous n'aurez pas besoin de vous inquiéter des locaux éteints modifiés à partir d'autres threads.

AFAIK Création des locaux comme Cons C # ne créera aucune variable ou champ du tout, mais la valeur constante attribuée sera placée en ligne partout où vous l'utilisez dans la méthode.


0 commentaires

13
votes

A const n'est pas une variable, c'est pourquoi cela s'appelle une constante.


3 commentaires

De Wikipedia "Une constante est un type spécial de variable". en.wikipedia.org/wiki/ConStant_(Programmation) . Toutes mes excuses pour l'utilisation paresseuse des termes en OQ.


Un cons n'est pas une variable dans sa signification originale (c'est-à-dire qu'elle n'est pas variable, mais constante). Cependant, je suis à peu près sûr qu'un 'const int' peut être appelé une variable Const.


@Ben: Wikipedia est tort jusqu'à ce que c # est concerné. En C # une constante n'est pas une sorte de variable. Une variable est définie dans C # comme emplacement de stockage dont le contenu peut varier. Une constante n'est ni un lieu de stockage ni ne peut varier.



13
votes

Les variables "const" doivent avoir un type primitif (par exemple int, bool). Chaque fois qu'une variable "const" apparaît dans le code source (qu'elle soit locale ou globale), cette instance est remplacée par la valeur constante elle-même. Donc:

return 111;


4 commentaires

Il y a un certain nombre d'erreurs dans cette réponse. Tout d'abord, "Cons variable" est un oxymoron; Les constantes ne sont jamais variables car les variables sont Emplacements de stockage qui contiennent une valeur capable de changer et que les constantes sont valeurs (non des emplacements de stockage) que ne peuvent pas changer .


Deuxièmement, les constantes ne sont pas tenues d'être de type "primitif". Les constantes peuvent être de tout type de valeur intégrée (INT, court, etc.) ou de toute constante de chaîne, ou une référence null de tout type de référence.


Troisièmement, je ne comprends pas ce que l'être de type primitif ou être connu au moment de la compilation a à voir avec le filetage. Les constantes ne sont pas threadsafe "parce qu'ils sont de type primitif". Les constantes sont threadsafe parce que par définition, elles ne peuvent pas changer et ne sont donc jamais observées pour avoir des valeurs incohérentes sur deux threades différents.


@ERIFLIPPERT Je pense que la même chose, mais j'aimerais souligner que je pense que ce que Staalik a voulu dire «ils n'existent que lors de la compilation» était le fait que les noms de const sont optimisés et rendaient indiscernables des valeurs "littérales" pendant la compilation étape.



2
votes

L'avantage principal de l'utilisation locale à l'aide locale Const est donc de sorte que vous n'agissez pas accidentel, définissez l'identifiant sur une autre valeur pouvant modifier l'exactitude de votre code.


0 commentaires

11
votes

Une constante n'est pas une variable et elle n'est réellement stockée nulle part. Comme il n'est pas stocké, ce n'est pas un membre d'instance, et ce n'est pas statique.

La constante n'est qu'un nom pour une valeur. Lorsque le code est compilé, la valeur est insérée lorsque la constante est utilisée. (Cela a des implications si vous utilisez une constante déclarée dans un assemblage différent. La modification de la valeur déclarée de la constante ne change pas la valeur utilisée tant que vous recompilez le code qui utilise la constante.)

Donc, une constante déclarée localement fonctionne exactement comme une constante déclarée ailleurs, ce n'est que la portée qui diffère.


4 commentaires

Pour clarifier - les endroits où je n'ai vu que const est appelé statique est incorrect?


@Ben: Oui, les constantes ne sont pas statiques. Une variable statique a un stockage statique, tandis qu'une constante n'a aucun stockage.


@Ben, @guffa. Non, ce n'est pas tout à fait raison. Juste parce qu'une constante n'a pas d'emplacement de stockage associé n'implique pas que ce n'est pas un membre! Un champ constant est un membre de son type de déclaration, et c'est en fait un membre statique .


@ Scientifique: Oui, vous avez raison que les constantes sont classées comme membres statiques (pour une raison quelconque), mais elles ne sont pas stockées statiquement, ce qui est le point important de cette question.



-3
votes

J'ai posté cela aussi à Pourquoi ne peut-il pas Je déclare une constante à l'aide de Var en C #?

constantes sans var: xxx

constantes avec var (les valeurs de propriété de type anonyme ne peuvent pas être modifiées après la création): xxx


1 commentaires

L'objet que vous avez créé ne peut pas être muté, mais la variable que vous avez mise dans peut être mutée pour pointer vers un autre objet entièrement, ce qui ne le fait pas le même dans un champ constant.



4
votes

J'ai besoin de carrefour pour dire que je ressens que les réponses de consensus déjà données ne sont pas complètes.

Prendre la liberté de résumer ces réponses, le consensus est que nous devrions considérer le code suivant pour ne pas être une déclaration variable, Mais plutôt une sorte de déclaration de macro dans laquelle le compilateur incroduit la valeur constante partout où l'identifiant est utilisé: xxx

Cependant, cette réponse a répondu aux questions qui se posent si la Const "variable" est déclarée à l'aide d'une expression constante (éventuellement complexe), telle que: xxx

dans un tel cas, cela fait la différence si le compilateur évalue l'expression une fois et "stocke «Le résultat de la réutilisation (comme une variable statique) ou s'il exécute l'expression chaque fois que l'identifiant est utilisé (comme une macrodefine macro en C / C ++).

dans mon propre poking , J'ai trouvé la description suivante dans http://www.techopedia.com/definition/3 768 / Constant-C qui parle à ce problème:

Dans le contexte de C #, une constante est un type de champ ou une variable locale dont la valeur est définie au moment de la compilation et ne peut jamais être modifiée au moment de l'exécution. Il est similaire à une variable en ayant un nom, une valeur et un emplacement de mémoire. Cependant, il diffère de la variable par sa caractéristique d'être initialisé une seule fois dans l'application. Une constante est déclarée à l'aide du mot clé "const".

Certes, la partie "Emplacement mémoire" est une sorte de tronçon - je le prends pour dire que la valeur constante est stockée localement pendant la compilation. Comme mentionné ailleurs, vous ne pouvez jamais accéder à cette mémoire dans votre code. Sinon, cela semble être cohérent avec ce que j'ai lu dans la spécification de langue C #:

8.5.2 Déclarations constantes locales

a déclaration de constante locale déclare une ou plusieurs constantes locales.

Déclaration locale-constante:

Const Type {déclarants constants,} Constant-Déclarateur

Constant-Constator:

identifiant = expression constante

et:

7.19 Expressions constantes

a expression constante est une expression qui peut être entièrement évaluée au moment de la compilation.

Expression constante:

expression

...

Chaque fois qu'une expression remplit les conditions énumérées ci-dessus, l'expression est évaluée à la compilation. Ceci est vrai même si l'expression est une sous-expression d'une expression plus grande contenant des constructions non constantes.

Tous les commentaires sur ce "Quanser" sont les bienvenus: ^)


1 commentaires

Il est intéressant de noter assez, le compilateur C # est réellement autorisé à évaluer les opérations sur les constantes à la compilation, de sorte que même si const a fait quelle macro C ++ ferait et déposerait toute l'expression incapuée partout dans le code, chacun de ces distincts Les expressions seraient calculées au moment de la compilation en une seule valeur constante. Faire le calcul une fois avant de plonger la valeur dans partout, son utilisation accélérerait la Compilation TIME (que je suis sûr que cela ne ferait pas d'effet sur la vitesse d'exécution du programme.