8
votes

Pourquoi avez-vous besoin de mettre une pause après la dernière étiquette d'une déclaration de commutation?

Sûrement Le compilateur sait que c'est la dernière étiquette de l'instruction ?


5 commentaires

C'est pour vous aider le programmeur, pas le compilateur. Et si vous ajoutez une autre déclaration après cela et oubliez la pause?


@Byron: Ce serait une erreur de compilation dans C #, non? Donc, vous remarqueriez.


@Thilo - juste parce que c'est une erreur de compilation ne signifie pas que le compilateur a besoin de celui-ci. Les erreurs de temps de compilation sont beaucoup plus faciles et moins chères à corriger que les heures d'exécution. C'est pourquoi Microsoft a inclus cela dans la spécification de la langue. Voir C / C ++.


@Byron: C'est ce que je voulais dire. L'erreur de compilation et l'obligation d'avoir la pause sont là pour aider le programmateur (par opposition à C / C ++ où l'erreur que vous avez mentionnée peut facilement se produire). Je pense que nous sommes sur la même page. (+1 pour les concepteurs de langue C # pour cela, je souhaite que les gars Java avaient eu la même idée. C'est un bon cas pour briser la compatibilité en arrière avec la syntaxe C)


Dupliqué possible de commutation: avez-vous besoin de la dernière pause ? (JavaScript principalement)


9 Réponses :


3
votes

dans C # Switch Switchs Vous devez indiquez explicitement pour casser ou goto un autre cas ou goto défaut.

en C et C ++, les déclarations de commutation sont tombées à travers des étiquettes sans pause. Avoir l'utilisateur dit explicitement ce qu'ils veulent faire est important dans C # pour éviter les insectes. Beaucoup d'utilisateurs viennent à C # à partir de C ++ par exemple.


À propos de la dernière déclaration de cas en particulier que vous demandez. Je peux penser à 3 bonnes raisons.

  1. Il est important de garder les choses cohérentes dans n'importe quelle langue.
  2. Et si vous appendez un autre cas après coup, ce qui devrait être fait avec défaut?
  3. Pourquoi casserez-vous être la valeur par défaut? Pourquoi ne pas aller? Il y a une ambiguïté ici.

2 commentaires

C'est une question C #. Mais peu importe, pourquoi le compilateur doit-il avoir besoin de casser après le dernier label?


Cela n'en a pas besoin, mais la langue l'exige.



7
votes

C'est parce que dans C ++, c'est ce qui se passe: xxx

si a est 1, puis - selon les règles C ++ - les deux "Faire des choses" et "faire d'autres choses" se produirait. Pour que les programmeurs C ++ venant à C # ne soient pas trébuchés (et de rendre le code plus clairement tout «rond), C # exige que vous spécifiez explicitement si vous souhaitez que vous souhaitez casser ou tomber sur une étiquette différente. < / p>

Maintenant, comme pour la raison pour laquelle vous avez besoin de la pause sur le bloc dernier , c'est une simple question de cohérence. Cela facilite également la factivité: Si vous déplacez les cas autour des cas, vous ne vous retrouvez pas soudainement avec des erreurs à cause d'une déclaration manquante Déclaration . En outre, que se passe-t-il lorsque vous souhaitez ajouter une autre étiquette, etc, etc.


1 commentaires

Je parle d'après le dernier label. Il n'y a plus d'étiquettes à éviter, il n'y a donc pas besoin de la déclaration de pause.



3
votes

Cohérence. Même raison que pouvoir avoir une virgule après la dernière définition de l'énumération ou la dernière affectation dans une déclaration d'instanciation d'objet avec des accolades. Et le dernier cas pourrait ne pas toujours être le dernier cas.

Cela le rend également donc il y a moins de cas spéciaux.

Et si tel est le cas, il est plus facile d'apprendre, d'écrire ou de lire. Bien que cela ajoute à la cohérence.


0 commentaires

6
votes

Avoir une pause après la déclaration de cas de votre commutateur est bonne Programmation défensive . Si, peut-être à l'avenir, une autre déclaration de cas est ajoutée ci-dessous, elle supprime le risque du flux du programme tomber de de l'affaire ci-dessus.


1 commentaires

MS dit que la valeur par défaut est toujours évaluée: "Le cas par défaut peut apparaître dans n'importe quel ordre dans la déclaration de commutation. Quelle que soit sa commande dans le code source, elle est toujours évaluée en dernier lieu, après que toutes les étiquettes de cas a été évaluée." Donc, votre raisonnement n'est pas correct.



1
votes

Lorsque vous utilisez un commutateur , sur break n'est pas la seule option. Vous avez également la possibilité d'aller dans un autre cas, allant à l'affaire par défaut, allant à une autre étiquette ou revenant. Il est également possible d'avoir plusieurs cas qui ont un seul organe de mise en œuvre. Comme il y a jusqu'à cinq options, plus la capacité d'avoir plusieurs cas pour une implémentation, le compilateur n'est pas capable de simplement mettre la réponse "correcte".

Vous devez choisir ce que vous avez l'intention de faire. Il garantit que le compilateur fait la bonne chose, rend votre code plus clairement et rend plus difficile de faire des choses à programmer stupides, comme ajouter un autre cas après le "dernier" et oublie de mettre une pause / goto / retour.


0 commentaires

3
votes

Selon http://msdn.microsoft.com/en-us /Library/06tc147t.aspx

Vous ne pouvez pas "tomber" toute section de commutation, y compris la dernière.

L'automne peut être évitée par l'une des opérations suivantes: Pause, goto ou retour.


1 commentaires

MDR. Je faisais juste référence à ce que dit le site Web, pas ce qui est intelligent.



2
votes

En fait il y a un cas lorsque vous n'avez pas à mettre la pause forte>

Considérez ce code: P>

case 4:
    while (true)
        Console.WriteLine("Endless looping. . . .");


1 commentaires

"Cela explique pourquoi la valeur par défaut n'a pas besoin d'une pause. En fait, toute étiquette inaccessible n'a pas besoin de pause ni de retour ni de retour", mais cela n'explique pas, pourquoi nous avons besoin d'une pause sur codable code . Poste cool quand même.



0
votes

selon Ce message de blog par ERIC LIPPERT (CAS 2), il vous permet de pouvoir rétroverser arbitrairement vos sections de commutateur sans introduire accidentellement un changement de rupture:

It [le compilateur] exige que chaque section de commutation, y compris le dernier, avoir un point final inaccessible. Le but de cette règle et de la non-retombée règle en général, est que nous voulons que vous être capable de ré-commander arbitrairement vos sections de commutation sans introduisant accidentellement une rupture changer.


0 commentaires

0
votes

Comme mentionné, vous pouvez utiliser la valeur par défaut :, mais considérez la case null aussi. Case NULL: A besoin d'une pause;

cas null: IEVALUATEDTONOTHING (); pause;

Si vous voulez "cascade", vous pouvez faire quelque chose comme ça; xxx

Vous pouvez l'utiliser avec des pauses au besoin, mais une est requis sur la dernière évaluation.


0 commentaires