98 votes

Quelqu'un utilise-t-il encore [goto] en C# et si oui, pourquoi ?

Je me demandais si quelqu'un utilise encore la syntaxe du mot-clé "goto" en C# et quelles sont les raisons possibles de le faire.

J'ai tendance à considérer comme une mauvaise pratique toute déclaration qui amène le lecteur à sauter dans le code, mais je me demandais s'il existait des scénarios crédibles pour l'utilisation d'une telle syntaxe ?

Aller à la définition des mots-clés

90voto

Heinzi Points 66519

Il existe certains cas (rares) où le goto peut réellement améliorer la lisibilité. En fait, la documentation à laquelle vous avez fait référence donne deux exemples :

Une utilisation courante de goto consiste à transférer le contrôle à une étiquette de cas de commutation spécifique ou à l'étiquette par défaut dans une instruction de commutation.

L'instruction goto est également utile pour sortir de boucles profondément imbriquées.

Voici un exemple pour ce dernier point :

for (...) {
    for (...) {
        ...
        if (something)
            goto end_of_loop;
    }
}

end_of_loop:

Bien sûr, il existe d'autres moyens de contourner ce problème, par exemple en transformant le code en une fonction, en utilisant un bloc factice autour du code, etc. cette question pour plus de détails). À titre d'information, les concepteurs du langage Java ont décidé d'interdire les éléments suivants goto complètement et introduire une pause labellisée à la place.

64voto

V4Vendetta Points 15354

Je me souviens de cette partie

switch (a)     
{ 
    case 3: 
        b = 7;
        // We want to drop through into case 4, but C# doesn't let us
    case 4: 
        c = 3;
        break; 
    default: 
        b = 2;
        c = 4;
        break; 
}

A quelque chose comme ça

switch (a)     
{
    case 3: 
        b = 7;
        goto case 4;    
    case 4: 
        c = 3;
        break;     
    default: 
        b = 2;
        c = 4;
        break;
}

Voir Ce site

23voto

Jon Skeet Points 692016

Je l'utilise abondamment dans Eduasync pour montrer le type de code que le compilateur génère pour vous lorsque vous utilisez des méthodes asynchrones en C# 5. Vous verriez la même chose dans les blocs d'itérateurs.

En code "normal" par contre, je ne me souviens pas de la dernière fois où je l'ai utilisé...

9voto

Jesus Ramos Points 15798

Goto est idéal pour sortir de nombreuses boucles où break ne fonctionnerait pas bien (par exemple en cas d'erreur), et comme l'a dit Kragen, goto est utilisé par le compilateur pour générer des instructions switch et d'autres choses encore.

5voto

Justin Points 42106

Le compilateur utilise goto dans divers éléments du code généré, par exemple dans les types de blocs d'itérateurs générés (générés lors de l'utilisation de l'instruction yield return Je suis presque sûr que les types de sérialisation XML générés ont également quelques mots-clés de type goto Les déclarations sont également présentes quelque part.

Voir Détails de la mise en œuvre du bloc Iterator : machines à états générées automatiquement pour plus de détails sur le pourquoi du comment le compilateur C# gère cela.

En dehors du code généré, il n'y a pas de bonne raison d'utiliser un fichier de type goto dans un code normal - cela rend le code plus difficile à comprendre et, par conséquent, plus sujet aux erreurs. D'un autre côté, l'utilisation de goto dans le code généré peuvent simplifier le processus de génération et sont normalement acceptables car personne ne va lire (ou modifier) le code généré et il n'y a aucune chance que des erreurs soient faites car une machine fait l'écriture.

Voir Déclaration d'intention considérée comme nuisible pour un argument contre goto ainsi qu'une pièce classique de l'histoire de la programmation.

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