87 votes

Pourquoi C # autorise-t-il {} les blocs de code sans instruction précédente?

Pourquoi C # autorise-t-il les blocs de code sans déclaration préalable (par exemple, if , else , for , while )?

 void Main()
{
    {   // any sense in this?
        Console.Write("foo");
    }
}
 

145voto

João Angelo Points 24422

Le `` a au moins l’effet secondaire de l’introduction d’une nouvelle étendue pour les variables locales.

J’ai tendance à les utiliser dans `` des déclarations à fournir une portée différente pour chaque cas et de cette façon me permettant de définir une variable locale ayant le même nom au plus proche endroit possible de leur utilisation et pour désigner également qu’elles sont uniquement valides au niveau de l’affaire.

90voto

BoltClock Points 249668

Dans le contexte que vous donnez, il n'y a pas de signification. Écriture d'une chaîne constante à la console fonctionne de la même manière n'importe où dans le flux du programme.1

Au lieu de cela, vous utilisez généralement pour limiter la portée des variables locales. Ceci est expliqué plus en détail ici et ici. Regardez João Angelo réponse et Chris Wallis réponse pour de brefs exemples. Je crois que la même chose s'applique à certaines autres langues, avec la C-la syntaxe de style, pas qu'ils seraient pertinentes à cette question.


1Sauf si, bien sûr, vous décidez d'essayer d'être drôle et de créer votre propre Console classe, avec un Write() méthode qui fait quelque chose de complètement inattendu.

56voto

Chris Wallis Points 1021

Ce n'est pas tant une fonction de C# que c'est une logique des effets secondaires de nombreux C de la syntaxe des langues qui utilisent des appareils pour définir la portée.

Dans votre exemple, les accolades ont plus aucun effet, mais dans le code suivant, ils définissent la portée, et donc la visibilité d'une variable:

Ce qui est permis que je tombe hors de la portée dans le premier bloc, et est définie de nouveau dans le prochain:

{
    {
        int i = 0;
    }

    {
        int i = 0;
    }
}

Ce n'est pas autorisé comme je l'ai a chuté hors de portée et n'est plus visible à l'extérieur de la portée:

{
    {
        int i = 0;
    }

    i = 1;
}

Et ainsi de suite et ainsi de suite.

18voto

RBaarda Points 388

Je considère {} comme une instruction qui peut contenir plusieurs déclarations.

Envisager une instruction if qui existe d'une expression booléenne suivie par unedéclaration. Ce serait le travail:

if (true) Console.Write("FooBar");

Cela fonctionnerait ainsi:

if (true)
{
  Console.Write("Foo");
  Console.Write("Bar");
}

Si je ne me trompe pas, cela s'appelle une instruction de bloc.

Depuis {} peut contenir d'autres instructions, il peut également contenir d'autres {}. La portée d'une variable est définie par son parent {} (instruction de bloc).

Le point que j'essaie de faire est qu' {} est juste une déclaration, de sorte qu'il n'a pas besoin d'un si ou quoi...

12voto

Massimo Points 697

La règle générale de la syntaxe C langues est "quelque chose entre { } devraient être traités comme une seule instruction, et il peut aller où une seule déclaration":

  • Après un if.
  • Après un for, while ou do.
  • N'importe où dans le code.

Pour toutes fins utiles, c'est comme la langue de la grammaire inclus ce:

     <statement> :== <definition of valid statement> | "{" <statement-list> "}"
<statement-list> :== <statement> | <statement-list> <statement>

Qui est, "une déclaration peut être composé de (plusieurs choses) ou d'une accolade d'ouverture, suivie par une déclaration de la liste (qui peut inclure un ou plusieurs états), suivie par une accolade fermée". I. E. "{ } bloc peut remplacer n'importe quelle déclaration, n'importe où". Y compris dans le milieu de code.

Ne permettant pas une { } bloc de n'importe où dans un seul état peut aller aurait effectivement fait de la définition du langage plus complexe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X