Déclaration de variable dans une instruction de changement C #

Pourquoi est-ce que, dans une instruction C # switch, pour une variable utilisée dans plusieurs cas, vous ne la déclarez que dans le premier cas?

Par exemple, l’erreur suivante génère l’erreur “Une variable locale nommée” variable “est déjà définie dans cette étendue”.

switch (Type) { case Type.A: ssortingng variable = "x"; break; case Type.B: ssortingng variable = "y"; break; } 

Cependant, selon la logique, la déclaration initiale ne doit pas être atteinte si le type est Type.B Toutes les variables d’une instruction switch sont-elles présentes dans une seule étendue et sont-elles créées / allouées avant qu’une logique soit traitée?

Je pense que cela a à voir avec la scope globale de la variable, c’est une scope au niveau du bloc qui est définie au niveau du commutateur.

Personnellement, si vous définissez une valeur dans quelque chose à l’intérieur d’un commutateur dans votre exemple pour qu’il soit vraiment utile, vous voudrez quand même le déclarer en dehors du commutateur.

Si vous souhaitez qu’une variable soit affectée à un cas particulier, insérez simplement le cas dans son propre bloc:

 switch (Type) { case Type.A: { ssortingng variable = "x"; /* Do other stuff with variable */ } break; case Type.B: { ssortingng variable = "y"; /* Do other stuff with variable */ } break; } 

Oui, le champ d’application est l’ensemble du bloc de commutation – malheureusement, IMO. Vous pouvez toujours append des accolades dans un seul cas, cependant, pour créer une scope plus petite. Quant à savoir si elles ont été créées / allouées – le cadre de la stack dispose de suffisamment d’espace pour toutes les variables locales d’une méthode (en laissant de côté la complexité des variables capturées). Ce n’est pas comme si l’espace était alloué pendant l’exécution de la méthode.

Parce que leur scope est au bloc de commutation. La spécification du langage C # indique ce qui suit:

La scope d’une variable locale ou d’une constante déclarée dans un bloc de commutation est le bloc de commutation.

L’initialisation a lieu dans le cas, mais la déclaration est effectivement effectuée en haut du périmètre. (Psuedo-code)

 switch (Type) { ssortingng variable; case Type.A: variable = "x"; break; case Type.B: variable = "y"; break; } 

Les variables partagent la scope dans le compilateur C #. Cependant, la scope n’existe pas de la même manière dans CIL . En ce qui concerne la création / initialisation proprement dite … le modèle de mémoire .NET permet au compilateur de se déplacer en lecture / écriture un peu tant que des règles simples sont suivies à moins que la variable ne soit marquée comme volatile .

“Dans mes Daaaaays …”

swicth est une implémentation procédurale très primitive qui existe depuis l’âge de C lui-même (même avant C++ ).

L’ensemble du switch est un bloc qui sert de GOTO: contenu dans la scope GOTO: (d’où le : dans chaque case ). Si vous avez pris des cours d’assembleur, cela peut vous sembler familier.

C’est la raison pour laquelle l’utilisation des switch est plus utile lorsqu’elle est combinée avec Enum

 switch(mood) { case Mood.BORED: case Mood.HAPPY: drink(oBeer) // will drink if bored OR happy break; case Mood.SAD: // unnecessary but proofs a concept default: drink(oCoffee) break; }