32 votes

Que fait un point-virgule après un bloc conditionnel en C# ?

Je suis récemment tombé sur ce code dans un projet - qui, je suppose, était là par erreur :

if(condition)
{
   //Whatever...
};

Notez le point-virgule après l'accolade finale.

Quelqu'un sait-il quel en est l'effet ?

Je suppose que cela n'a aucun effet, mais j'aurais pensé que cela aurait provoqué une erreur de compilation.

2 votes

Avez-vous essayé de le compiler ? Quel a été le résultat ?

31 votes

C'est juste une terminaison de ligne inutile - if(true) {};;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;‌​;;;;;;;;;;;; compilera

1 votes

C'est juste une déclaration vide.

34voto

scharette Points 5420

C'est une question simple avec une réponse simple, mais je voulais juste ajouter quelque chose de pertinent. Souvent, les gens comprennent qu'il ne fait rien et particulièrement pour le cas que vous avez présenté, le point-virgule est une terminaison de ligne inutile.

Mais quel est le raisonnement qui sous-tend cette décision ?

En fait, ces déclarations vides sont autorisées pour des déclarations comme celles-ci :

 // Use an empty statement as the body of the while-loop.
while (Method())
        ;

Je suis d'accord pour dire que cela ne sert à rien. Mais il peut aider certaines boucles à se conformer aux exigences syntaxiques du langage et je pense que c'est ce que les gens devraient en comprendre. Comme d'autres l'ont dit, je suis d'accord pour dire que vous pouvez le supprimer, je voulais juste souligner pourquoi C# l'autorise.

Précisions supplémentaires

Une instruction vide est utilisée lorsque vous n'avez pas besoin d'effectuer une opération pour laquelle une instruction est nécessaire. Elle transfère simplement le contrôle au point final de l'instruction. Elle n'a aucun effet, c'est du pur sucre syntaxique .

Comme indiqué par @PaulF, dans l'exemple ci-dessus, vous podría utiliser un bloc vide ( {} ) à la place. Cela serait totalement valable et aurait le même effet.

Encore une fois, tout est question de style. Vous n'en avez pas besoin, mais cela peut certainement vous aider à vous conformer aux règles de vos environnements de codage.

Cas d'utilisation courants (où l'on pouvait voir des déclarations vides)

  • Boucle While avec un corps vide (même cas que celui que j'ai souligné ci-dessus)

    void ProcessMessages()
    {
        while (ProcessMessage())
            ; // Statement needed here.
    }
  • goto déclarations (rarement utilisé mais toujours valable)

    void F()
    {
        //...
        if (done) goto exit;
    //...
    exit:
        ; // Statement needed here.
    }

    De MSDN

  • Déclaration de classe (Props à @EricLippert pour avoir apporté celui-ci)

    class SomeClass
    {
        ...
    };

Notez que dans ce cas, comme l'a déclaré @EricLippert dans la section des commentaires, il s'agit simplement d'une courtoisie envers les programmeurs C++ qui ont l'habitude de taper des semis après les cours ; le C++ exige ceci .

Même si l'utilisation générale des instructions vides est discutable, principalement en raison de la confusion qu'elles peuvent apporter, à mon avis, d'un point de vue syntaxique, elles ont leur place en C#. Il ne faut pas oublier que le C# est un incrémenter de C++ (qui expliquent principalement les # aka. quatre symboles "+" dans une grille deux par deux) et pour des raisons historiques, autoriser les déclarations vides facilitait la transition.

0 votes

Cela n'explique pas vraiment pourquoi le C# le permet comme "while (Method()) {}" est syntaxiquement valide et a un effet similaire.

0 votes

@PaulF Donner un nom à vos méthodes C# "mes_méthodes" est syntaxiquement valide et a également un effet similaire. Tout est question de style.

0 votes

Je pense que le raisonnement derrière cette autorisation est qu'il est beaucoup plus simple (du point de vue de la syntaxe) d'autoriser les déclarations vides que de les interdire. De même qu'il est valable d'intégrer du code n'importe où dans des accolades ou même d'avoir des paires d'accolades "{}" ne contenant rien entre les déclarations. Mais je suis d'accord que c'est (ou peut être) une question de style. Upvoted avec votre clarification supplémentaire.

17voto

Isaac Abramowitz Points 481

Cela ne semble pas avoir d'effet, bien que je ne recommande pas d'écrire du code de cette façon.

Au cas où vous voudriez un jour ajouter un else o else if après le ; il ne sera pas compilé.

Ex :

if(5>1) {
  //whatever
}; else {
  //whatever
}

Cela ne compilera pas (notez le ; avant else )

3 votes

Ce que vous dites n'est pas faux, mais vous changez l'objectif de la question. Il n'arrive pas à compiler parce que else ne peut pas trouver un if qui le précède. Vous avez ajouté le else mais pas l'OP. La question est de savoir pourquoi le point-virgule à la fin est autorisé, pas s'il y a des cas où un point-virgule au milieu causera des problèmes.

8voto

Fuzzybear Points 124

C'est quelque chose que Visual Studio compilera comme une syntaxe valide pour une déclaration vide, puisqu'il s'agit simplement d'une terminaison de déclaration. Votre code sera compilé et l'extension ; ne sera pas un problème.

Vous pouvez le supprimer pour nettoyer le code si vous le souhaitez, mais le laisser en place n'aura aucun effet négatif.

J'espère que cela vous aidera.

2 votes

Visual Studio ne l'ignorera pas, le compilateur C# le compilera comme une syntaxe valide pour une déclaration vide, ce qui entraînera la même génération d'IL que l'instruction if sans le point-virgule de fin.

0 votes

@AaronM.Eshbach true ; each ; émettra un nop .

3 votes

@SebastianHofmann : Le nop n'est émis que si les optimisations sont désactivées.

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