C# Switch 语句中的失败行为
在 C# 中,switch 语句允许在匹配多个情况时顺序执行代码。但是,默认情况下,switch 语句需要在每个 case 末尾有一个显式的 break 语句,以防止意外行为。
考虑以下代码示例:
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; }
此代码尝试将数字及其字符串表示形式。但是,switch 语句会引发错误,指出控制不能从情况 3 转移到情况 2,以及从情况 2 转移到默认情况。原因是在 C# 中,switch 语句需要显式中断以防止后续 case 的意外执行。
要实现失败行为,可以使用特殊的 goto case 语法。以下是示例中的实现方式:
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"); }
在此修改后的代码中,goto case 关键字允许执行跳至下一个 case,而不需要显式的 break 语句。通过在 case 3 之后添加 goto case 2,无论输入数字的长度如何,都会执行该 case 下面的代码(转换十和个)。类似地,在 case 2 之后添加 goto default 可确保始终执行 default case。
在某些情况下可能需要这种失败行为,例如在提供的示例中将数字转换为其相应的单词表示形式。然而,明智且谨慎地使用它很重要,因为粗心的失败可能会导致复杂且容易出错的代码。
以上是Fallthrough 行为在 C# Switch 语句中如何工作,以及何时应使用'goto case”?的详细内容。更多信息请关注PHP中文网其他相关文章!