Comportement de transition dans les instructions Switch C#
En C#, les instructions switch permettent l'exécution séquentielle du code lors de la correspondance de plusieurs cas. Cependant, par défaut, les instructions switch nécessitent une instruction break explicite à la fin de chaque cas pour éviter un comportement inattendu.
Considérez l'exemple de code suivant :
string NumberToWords(int number) { string[] numbers = new string[] { "", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; string[] tens = new string[] { "", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" }; string[] teens = new string[] { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" }; string ans = ""; switch (number.ToString().Length) { case 3: ans += string.Format("{0} hundred and ", numbers[number / 100]); case 2: int t = (number / 10) % 10; if (t == 1) { ans += teens[number % 10]; break; } else if (t > 1) ans += string.Format("{0}-", tens[t]); case 1: int o = number % 10; ans += numbers[o]; break; default: throw new ArgumentException("number"); } return ans; }
Ce code tente de convertir un nombre à sa représentation sous forme de chaîne. Cependant, l'instruction switch génère une erreur indiquant que le contrôle ne peut pas passer du cas 3 au cas 2 et du cas 2 à la valeur par défaut. La raison en est qu'en C#, les instructions switch nécessitent des interruptions explicites pour empêcher l'exécution involontaire des cas suivants.
Pour obtenir un comportement de repli, on peut utiliser la syntaxe spéciale goto case. Voici comment cela peut être implémenté dans l'exemple :
switch (number.ToString().Length) { case 3: ans += string.Format("{0} hundred and ", numbers[number / 100]); goto case 2; case 2: int t = (number / 10) % 10; if (t == 1) { ans += teens[number % 10]; break; } else if (t > 1) ans += string.Format("{0}-", tens[t]); goto default; case 1: int o = number % 10; ans += numbers[o]; break; default: throw new ArgumentException("number"); }
Dans ce code modifié, le mot-clé goto case permet à l'exécution de passer au cas suivant, sans nécessiter une instruction break explicite. En ajoutant un goto case 2 après le cas 3, le code situé en dessous de ce cas (qui convertit les dizaines et les unités) est exécuté quelle que soit la longueur du nombre saisi. De même, l'ajout de goto default après le cas 2 garantit que le cas par défaut est toujours exécuté.
Ce comportement de repli peut être souhaitable dans certaines situations, telles que la conversion de chiffres en leurs représentations de mots correspondantes dans l'exemple fourni. Cependant, il est important de l'utiliser judicieusement et avec prudence, car une erreur imprudente peut conduire à un code complexe et sujet aux erreurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!