C# instruction Switch avec/sans les accolades... quelle est la différence?
A C# toujours permis d'omettre les accolades à l'intérieur d'un switch()
instruction entre les case:
états?
Quel est l'effet de l'omission, comme les programmeurs javascript souvent faire?
Exemple:
switch(x)
{
case OneWay:
{ // <---- Omit this entire line
int y = 123;
FindYou(ref y);
break;
} // <---- Omit this entire line
case TheOther:
{ // <---- Omit this entire line
double y = 456.7; //legal!
GetchaGetcha(ref y);
break;
} // <---- Omit this entire line
}
- De monde java stackoverflow.com/questions/633497/...
Vous devez vous connecter pour publier un commentaire.
Accolades ne sont pas nécessaires, mais ils peuvent venir dans maniable pour introduire un nouveau déclaration de l'espace de. Ce comportement n'a pas changé depuis C# 1.0 autant que je sache.
L'effet de l'omission est que toutes les variables déclarées quelque part à l'intérieur de la
switch
déclaration sont visibles à partir de leur point de déclaration dans tous les cas branches.Voir aussi Eric Lippert l'exemple (cas 3 dans le post):
Eric exemple:
Cela ne compile pas car
int y
etdouble y
sont dans la même déclaration de l'espace introduit par laswitch
déclaration. Vous pouvez corriger l'erreur en séparant la déclaration des espaces en utilisant des accolades:Les accolades sont un élément facultatif de la le bloc de commutateurs, ils ne font pas partie de l'interrupteur sections. L'appareil peut être placé à l'intérieur de l'interrupteur sections ou également inséré n'importe où pour le contrôle de la portée dans votre code.
Ils peuvent être utiles pour limiter la portée dans le bloc de commutateurs. Par exemple:
vs...
Remarque: en C# nécessite une valeur de y dans le cas 5 bloc dans le premier exemple avant de l'utiliser. C'est de la protection contre les chocs, les variables de suivre à travers.
Les accolades à l'intérieur du commutateur est en réalité pas partie de l'interrupteur de la structure à tous. Ils sont juste à portée de blocs que vous pouvez appliquer dans le code où vous le souhaitez.
La différence entre avoir et ne pas en avoir, c'est que chaque bloc a son propre champ d'application. Vous pouvez déclarer des variables locales à l'intérieur de la portée, qui n'entre pas en conflit avec d'autres variables dans un autre champ.
Exemple:
Ils ne sont pas strictement nécessaires, mais dès que vous commencez à déclarer des variables locales (dans le commutateur branches) ils sont très recommandé.
Cela ne fonctionne pas:
Cette compile mais c'est effrayant:
Donc c'est mieux:
Juste garder les choses simples et lisibles. Vous ne voulez pas exiger lecteurs d'avoir une connaissance détaillée des règles impliqués dans le milieu exemple.