91 votes

Pourquoi est-ce que C# et se briser si elle n'est pas en option?

Quand je crée un switch énoncé dans VS2008 C# comme ceci (fictive):

switch (state) {
    case '1':
        state = '2';
    case '2':
        state = '1';
}

il se plaint que je ne suis pas autorisé à déposer par le biais de:

Le contrôle ne peut pas tomber par le biais d'un label ('cas '1' (0x31):') à l'autre

Si vous n'êtes pas autorisé à laisser tomber, alors quel est le but de l' break déclaration? Pourquoi ne pas le langage des designers juste les laisser et saute automatiquement à la fin de l' switch déclaration au lieu de nous obliger à mettre en inutile de construire?

87voto

Jon Skeet Points 692016

Fondamentalement, pour le rendre plus familier pour C/C++/Java développeurs. Personnellement, je pense que c'était une erreur, mais c'est le raisonnement.

J'aurais préféré un forcé bloc:

case '1':
{
}

À côté de quelque chose d'autre, cela aurait évité l'étrange variable de délimitation de l'étendue des situations pour switch/case. Vous pourriez quand même avoir plusieurs cas où des étiquettes, bien sûr:

case '0':
case '1':
{
}

Il peut aussi être agréable d'être en mesure de faire la liste des causes multiples, plus simplement:

case '0', '1':
{
}

Oh, et une légère nit-pick sur votre description de l'existant langue: vous de ne pas avoir à faire une pause. C'est juste que la fin de l'affaire doit être inaccessible. Vous pouvez également avoir d' throw, goto ou return. Il y a peut être d'autres que j'ai raté, trop :)

73voto

Alex K. Points 67805

De la bouche des chevaux (MSDN) Pourquoi le C# instruction switch conçu pour ne pas permettre à l'automne, mais ont encore besoin d'une pause? (Miroir Lien).

Citant le saillant de bits, c'est pourquoi ils ne permettent pas de chute à travers:

L'implicite de chute à travers le comportement est souvent utilisé pour réduire la quantité de code nécessaire et souvent n'est pas un problème la première fois que le code est écrit. Cependant, comme le code se déplace à partir de la phase de développement initial dans une phase de maintenance, le code ci-dessus peut conduire à de subtiles erreurs qui sont très difficiles à déboguer. Ces erreurs résultent de l'erreur très commune de le développeur de l'ajout d'un cas, mais en oubliant de mettre une pause à la fin du bloc.

En C#, le commutateur déclaration explicite de contrôle de flux se produire à la fin d'une affaire, que ce soit une pause, goto, revenir, ou de le jeter. Si le développeur chute de désirs-par le biais de la sémantique, il peut être atteint par un explicite goto à la fin d'une instruction case.

Et c'est pourquoi il n'est pas automatique:

Comme résultat de la C# règles exigeant explicite de contrôle de flux à se produire à la fin d'un bloc (le plus souvent une pause), de nombreuses personnes se demandent pourquoi le comportement n'a pas changé de telle sorte que l'automne-grâce n'a pas eu lieu. Qui est, ne pas faire de pause nécessaire, il suffit de modifier la sémantique de l'interrupteur de ne pas avoir de chute de cas. La raison pour laquelle cela n'a pas été fait a été, de sorte que les développeurs ont été très utilisé en C++ de ne pas avoir un moment difficile la compréhension de ce qu'est une instruction switch.

46voto

Chris Points 2943

Vous êtes autorisé à tomber à travers, mais vous devez le faire explicitement avec l' goto mot-clé:

switch (state) {
    case '1':
        state = '2';
        goto case '2';
    case '2':
        state = '1';
        break;
}

Vous pouvez break ou gotoen C#, mais ce que vous ne pouvez pas faire est de ne pas l'etat qui vous voulez, parce que c'est une source potentielle de dur-à-spot de bugs.

C'est beaucoup plus facile à repérer que votre code dit - goto quand vous vouliez break (ou vice versa) que c'est à l'endroit que vous avez oublié d'ajouter que ce soit.

Cela peut paraître stupide, mais beaucoup fatigué de deux heures de recherche de la cause d'une C++ bug se termine par une soudaine prise de conscience que vous avez oublié d'ajouter un break et votre code est en baisse par tous les temps. C# évite qu'en le forçant à l'état ce que vous voulez.

12voto

simendsjo Points 2491

Si vous n'avez pas de code dans le cas 1, vous êtes autorisé à passer à travers, de sorte que vous pouvez dire que "tous ces cas de partager ce bout de code"

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