C# Switch ステートメントのフォールスルー動作
C# では、switch ステートメントを使用すると、複数のケースに一致する場合にコードを順次実行できます。ただし、デフォルトでは、switch ステートメントでは、予期しない動作を防ぐために、各ケースの最後に明示的な 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 ステートメントに明示的なブレークが必要であるためです。
フォールスルー動作を実現するには、特別な 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 キーワードにより、明示的な Break ステートメントを必要とせずに、実行を次のケースにフォールスルーできます。 case 3 の後に goto case 2 を追加すると、入力数値の長さに関係なく、その case より下のコード (10 と 1 を変換する) が実行されます。同様に、ケース 2 の後に goto default を追加すると、デフォルトのケースが常に実行されるようになります。
このフォールスルー動作は、提供された例の数字の対応する単語表現への変換など、特定の状況では望ましい場合があります。ただし、不注意なフォールスルーは複雑でエラーが発生しやすいコードにつながる可能性があるため、賢明かつ注意して使用することが重要です。
以上がC# の Switch ステートメントでのフォールスルー動作はどのように機能しますか? `goto case` をいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。