switch-case文って使ってますか?switch-case文は条件によって処理を分ける数が複数で多い場合に使われます。例えばサイコロの目は1から6までありますが、1から6までの出た目でそれぞれ処理が違う場合などです。
C#では整数値もしくは文字列を使って条件分岐を記述することができます。また、enumで定数を定義し、その定数名つまり文字列を使って条件分岐を記述することもできます。この記事では、switch-case文について
- switch-case文とは
- switch-case文、default句の使い方
- フォールスルーの禁止について
- enumの列挙子を使う方法
- 複数条件をcaseラベルに設定したい場合
など基本的な内容から、応用的な使い方の内容についても解説していきます。今回はswitch-case文について、使い方をわかりやすく解説します!
switch-case文とは
switch-case文は条件によって処理を変える場合に使います。条件によって処理を変える構文としてはIf文もあります。
if文との違いについて
If文は条件によって処理を分ける数がすくない場合に使われることが多いです。これに対してswitch文は条件によって分ける処理が多い場合に使われます。例えば、冒頭でお話ししたサイコロの目によって処理が変わる場合などです。
switch-case文、default句の使い方
switch-case文は次のように記述します。
switch(式) { case 値1: 式の結果と値1が一致したときの処理 break; case 値2: 式の結果と値2が一致したときの処理 break; }
swtich-case文では値が一致して処理を行ったあとに「break」句を使って処理を抜けなければなりません。caseラベルの値には整数値もしくは文字列を指定することができます。
caseラベルの使い方
整数値を使用する場合
caseラベルに整数値を指定する場合についてサンプルコードでみていきましょう。
using System; namespace Sample { class Sample { static void Main() { // サイコロの出目 int num = 3; switch(num) { case 1: Console.WriteLine("一の目がでました"); break; case 2: Console.WriteLine("二の目がでました"); break; case 3: Console.WriteLine("三の目がでました"); break; case 4: Console.WriteLine("四の目がでました"); break; case 5: Console.WriteLine("五の目がでました"); break; case 6: Console.WriteLine("六の目がでました"); break; } Console.ReadKey(); } } }
実行結果:
三の目がでました
このサンプルコードでは、int型の変数「num」が1から6のいずれかの値と一致した場合に、それぞれの処理が行われます。
文字列を使用する場合
caseラベルに文字列を使用する場合について、サンプルコードでみていきましょう。
using System; namespace Sample { class Sample { static void Main() { string day = "水曜日"; switch(day) { case "月曜日": Console.WriteLine("月曜日です"); break; case "火曜日": Console.WriteLine("火曜日です"); break; case "水曜日": Console.WriteLine("水曜日です"); break; case "木曜日": Console.WriteLine("木曜日です"); break; case "金曜日": Console.WriteLine("金曜日です"); break; case "土曜日": Console.WriteLine("土曜日です"); break; case "日曜日": Console.WriteLine("日曜日です"); break; } Console.ReadKey(); } } }
実行結果:
水曜日です
このサンプルコードでは、caseラベルに文字列を指定しています。
しかも、その文字列は日本語でも問題ありません。
default caseの使い方
ここまでは、switch節で指定した式とcaseラベルの値が一致した場合に行われる処理についてみてきました。それでは、caseラベルのどの値にも一致しない場合はどのようになるのでしょうか?
caseラベルのどの値にも一致しない場合は、switchブロックから抜けて次の処理に移ります。処理を行いたい場合は、default caseを使います。サンプルコードで確認しましょう。
using System; namespace Sample { class Sample { static void Main() { // サイコロの出目 int num = 0; switch(num) { case 1: Console.WriteLine("一の目がでました"); break; case 2: Console.WriteLine("二の目がでました"); break; case 3: Console.WriteLine("三の目がでました"); break; case 4: Console.WriteLine("四の目がでました"); break; case 5: Console.WriteLine("五の目がでました"); break; case 6: Console.WriteLine("六の目がでました"); break; default: Console.WriteLine("numの値が不正です"); break; } Console.ReadKey(); } } }
実行結果:
numの値が不正です
このサンプルコードでは、int型の変数「num」が1から6のいずれかの値と一致した場合に、それぞれの処理が行われますが、変数「num」に代入された値は0(ゼロ)です。
1から6の値のいずれとも一致しませんので、defaultで定義した処理が実行されています。
フォールスルーの禁止について
先ほどのサンプルコードではdefault caseを使いました。default節の中では「break」を記述しています。default節の後には処理を記述していないので、「break」を省略しても構わないと考えがちです。
しかし、この「break」を省略してコンパイルしようとしても、エラーが発生します。c#ではフォールスルーの禁止といって、原則「break」を省略できないようになっています。これは次のcase節へ処理が移らないようにするためです。
ですので、原則「break」を記述するようにしましょう。
でも、このフォールスルーが許される場合があります。それはcase節内の処理を記述せずにcaseを並べる場合です。いずれどこかのcase節で処理と「break」が記述されていれば問題ありません。
この場合はフォールスルーが許されます。複数の条件で同じ処理を行いたい場合に使います。サンプルコードで確認しましょう。
using System; namespace Sample { class Sample { static void Main() { string day = "水曜日"; switch(day) { case "月曜日": case "火曜日": case "水曜日": case "木曜日": case "金曜日": Console.WriteLine("平日です"); break; case "土曜日": case "日曜日": Console.WriteLine("休日です"); break; } Console.ReadKey(); } } }
実行結果:
平日です
このサンプルコードでは、いくつかのcase節で処理や「break」を記述していません。
いくつかのcase節で同じ処理を行いたい場合は、このように処理や「break」の記述を省略できて、フォールスルーが許されます。
enumの列挙子を使う方法
enumで宣言した文字列名を使ってswitch-case文を記述することができます。enumはオブジェクトを定義し、そのオブジェクトにenumの定数を代入して使用します。
switch文の式にはenumのオブジェクトを記述し、caseの値にはenumの定数名つまり文字列名を記述することができます。
サンプルコードで確認していきましょう。
using System; namespace Sample { // enumの定義 enum Days { Mon, Tue, Wed, Thu, Fri, Sat, Sun } class Sample { static void Main() { Days day = Days.Wed; switch(day) { case Days.Mon: case Days.Tue: case Days.Wed: case Days.Thu: case Days.Fri: Console.WriteLine("平日です"); break; case Days.Sat: case Days.Sun: Console.WriteLine("休日です"); break; default: Console.WriteLine("不正です"); break; } Console.ReadKey(); } } }
実行結果:
平日です
enumの使い方については、こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。
複数条件をcaseラベルに設定したい場合
Visual Basicではcaseラベルに複数条件を設定できますが、C#では複数条件を設定することはできません。複数条件を設定したい場合はIf文を使うようにしましょう。
複数条件を使う場合はOrやAndに対応した論理演算子を使います。いずれかの条件を満たすOrの場合は「||」、全ての条件を満たすAndの場合は「&&」記号を使います。
サンプルコードで確認しましょう。
using System; namespace Sample { class Sample { static void Main() { int age = 5; if(age < 7 || age > 18) { Console.WriteLine("7から18までの整数を入力してください"); } else if(age > 7 && age <= 12) { Console.WriteLine("小学生です"); } else if(age > 12 && age <= 15) { Console.WriteLine("中学生です"); } else if(age > 15 && age <= 18) { Console.WriteLine("高校生です"); } else { Console.WriteLine("入力値が不正です"); } Console.ReadKey(); } } }
実行結果:
7から18までの整数を入力してください
まとめ
ここでは、switch-case文について説明しました。switch-case文は条件によって処理を分ける数が多い場合に使うと便利です。原則フォールスルーが禁止されていますので、ご注意ください。
使いこなすことができるように、この記事を何度も参考にして下さいね!