プログラミングでは、さまざまな状況に対応できるようにコードを書く必要があります。 そのために、多くのプログラミング言語では制御文が提供されています。その一つが switch 文です。
switch 文とは
switch文は、ある変数の値によって処理を分岐させるための制御文です。 一言で言うと、「選択肢に対応した行動を決定する」ような機能を提供します。
あるお店でのメニュー選択を考えてみましょう。 注文したメニュー(例えば、ハンバーガー、フレンチフライ、シェイク)に対応して、店員さんはそれぞれ違う料理を作ります。 このメニューの選択と結果の料理のような関係が、switch文ととても似ています。
Switch文の基本的な書き方
Switch文の基本的な書き方は以下の通りです。
switch (変数) { case 値1: // 値1の時の処理 break; case 値2: // 値2の時の処理 break; default: // 上記以外の値の時の処理 break; }
各キーワードの説明です。
switch
switch文を始めます。これに続けて括弧()内に、分岐の元となる変数を書きます。
case
変数が特定の値を持つ場合の処理を記述します。これに続けてコロン:を書き、その後に該当する値が変数に存在する場合の処理を記述します。
たとえば、分岐に応じたメソッドの実行命令を記述します。
break
それぞれのcaseブロックの最後にはbreakを書きます。これは、そのブロックの処理が終わったらswitch文から出るためのキーワードです。メソッド自体を終了したい場合には return でも抜け出せます。
default
変数がどのcaseにも当てはまらない場合の処理を記述します。これはオプションで、必ずしも記述する必要はありません。
サンプルコード
それでは先ほどの、お店でのメニュー選択を例に、switch 文を作成した場合のサンプルコードです。
string menu = "ハンバーガー"; switch (menu) { case "ハンバーガー": // ハンバーガーを作る処理 break; case "フレンチフライ": // フレンチフライを作る処理 break; case "シェイク": // シェイクを作る処理 break; default: // それ以外のメニューの場合の処理 break; }
このサンプルコードにおいて switch文は、レストランの注文システムを模しています。
変数menuの値によって異なる処理を行いますので、処理を解説していきます。
string menu = "ハンバーガー";
上記の行では、string型の変数menuを定義し、その初期値を"ハンバーガー"に設定しています。 menuは、お客さんが注文したメニュー項目を保持します。
switch (menu) {
この行では、switch文が開始します。 switch文は、引数(ここではmenu)として渡された値に基づいてプログラムの制御を分岐します。
case "ハンバーガー": // ハンバーガーを作る処理 break;
caseキーワードは、switch文内の一つの分岐を表します。 ここでは、menuが"ハンバーガー"である場合に実行されるコードブロックを示しています。 このコメント部分では、具体的なハンバーガーを作る処理を実装する場所です。 例えば、特定のメソッドの呼び出し命令などを記述します。
break;は、現在のcaseブロックから抜け出し、switch文全体を終了するためのキーワードです。
それ以降のcaseブロック("フレンチフライ"と"シェイク")も同様の方法で機能します。
いずれかの case に該当した場合、break によって switch 文の処理は終了し、それ以降の case は実行されません。 そのため、case 内の処理は、他の case と重複して処理が動かないことが保証されます。
default: // それ以外のメニューの場合の処理 break;
defaultブロックは、すべてのcaseブロックが該当しない場合に実行されるコードを表します。 つまり、menuが"ハンバーガー"、"フレンチフライ"、"シェイク"のいずれでもない場合に、このブロックが実行されます。
このように switch 文を利用した処理を作成することで、読みやすい分岐処理を作成することが出来ます。
enumを活用したswitch文
C#では、特定の範囲の値を持つ変数を定義するためにenum(列挙型)を使用することができます。 このenumとswitch文を組み合わせると、コードの可読性と安全性を高めることができます。
例えば、先ほどのお店のメニューをenumとして定義し、それをswitch文で処理するケースを考えてみましょう。
// enumを定義します。 public enum Menu { ハンバーガー, フレンチフライ, シェイク } // enumを使用したswitch文 Menu menu = Menu.ハンバーガー; switch (menu) { case Menu.ハンバーガー: // ハンバーガーを作る処理 break; case Menu.フレンチフライ: // フレンチフライを作る処理 break; case Menu.シェイク: // シェイクを作る処理 break; default: // それ以外のメニューの場合の処理 break; }
enumでは 変数が取りうる値を明示的に示す(Menu.ハンバーガーや Menu.シェイク)ことができるため、他の開発者(または未来の自分)がコードを読むときに理解しやすくなります。 また、変数が取りうる値を制限することができるため、無効な値が割り当てられることを防ぐことができるためです。
このため、case での分岐条件を文字列で記述した場合とは異なり、メニューの名前を間違えることなく、明確にそれぞれの選択肢に対する処理を定義することができます。
このように switch 文の分岐条件に enumを使用すると、コードの可読性が向上し、安全に処理を記述出来るようになります。
まとめ
switch 文は、多岐にわたる条件分岐を実現するための制御文の一つです。 特に、ある変数の値によって、異なる処理を行いたい場合に便利です。
if-else文でも同じようなことは可能ですが、条件が多くなると可読性が下がるため、そのような場合にはSwitch文を使用すると効果的です。
色々な記法を知っておき、使いこなすスキルを身につけていくことで、プログラムの実装力が向上します。
ネットの記事や書籍などを元に学習する場合も、書かれているものをそのまま書き写すだけではなくて、 自分で読み返したときに読みやすいか、という部分も考えて学習するようにしていくと、プログラムへの読解力が増します。