web-dev-qa-db-fra.com

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

J'ai récemment rencontré ce code dans un projet - qui, je suppose, était là par erreur:

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

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

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

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

31
Alex

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 en particulier pour le cas que vous avez présenté, le point-virgule est une terminaison de ligne inutile.

Mais quelle en est la raison?

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

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

Je suis d'accord que cela ne fait rien. Mais cela 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 que vous pouvez le supprimer, je voulais juste souligner pourquoi C # le permet.

Précisions supplémentaires

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

Comme indiqué par @PaulF, dans l'exemple ci-dessus, vous pourriez utilisez un bloc vide ({}) au lieu. Ce serait totalement valable et aurait le même effet.

Encore une fois, tout se résume au 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 instructions vides)

  • Boucle while avec corps vide (même cas que je l'ai souligné ci-dessus)

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

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

    De MSDN

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

    class SomeClass
    {
        ...
    };
    

Notez que dans ce cas, comme indiqué par @EricLippert dans la section commentaires, c'est simplement une courtoisie pour les programmeurs C++ qui sont habitués à taper des demi-mots après les classes; C++ l'exige.

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, syntaxiquement parlant, elles ont une place en C #. Il ne faut pas oublier que C # est un incrément de C++ (ce qui explique surtout le # alias. quatre symboles "+" dans une grille de deux par deux) et pour des raisons historiques, autoriser des déclarations vides facilitait la transition.

33
scharette

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

Si vous souhaitez ajouter un else ou else if après le ;, il ne se compilera pas.

Ex:

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

Cela ne se compilera pas (notez le ; avant else)

18
Isaac Abramowitz

C'est quelque chose que Visual Studio compilera comme syntaxe valide pour une instruction vide, car il ne s'agit que d'une terminaison d'instruction. Votre code se compilera et le supplément ; ne sera pas un problème.

Il peut être supprimé pour nettoyer le code si vous le souhaitez, mais le laisser ne provoquera aucun effet négatif.

J'espère que cela t'aides.

8
Fuzzybear