C#のswitch文を解説!if文との違いやさまざまな使い方を紹介

C#のswitch文を解説!if文との違いやさまざまな使い方を紹介

C#エンジニア 案件・求人一覧はこちら

C#のswitch文とは?

まずはswitch文を使ってみよう

C#にはswitch文という便利な文法があります。他の言語でもswitch文を使えることが多いのですが、C#のswitch文は使いやすいと評価が高いのです。C#を学ぶ人は是非このswitch文を使いこなしてください。

switch文の例を以下に示します。

これを実行すると、結果は以下になります。

value is two.

switch文はif文よりコードが見やすい!

上の例は変数valの値が1ならone、2ならtwo、それ以外ならout of valueを表示するという処理です。これをif文で書くと、以下のようなコードになります。caseが多い場合、if文にするとelse if (条件)…が続いて冗長になります。switch文の方が見やすいですよね。

C#のswitch文は安全

C#のswitch文は他の言語とは違う特徴があります。それはフォールスルーを禁止していることです。以下のコードはvalが1でない時だけメッセージを出すことを意図していますが、このようなbreakを省略したコードはエラーになります。

C#のswitch文はC#が優れた言語である証

上の例はcase 2:にbreak;が無いという理由でエラーになります。意図的に省略したいこともあるかもしれませんが、実際はbreakを入れ忘れてしまうことの方が多く見受けられます。

CやC++やJavaではこのbreakの省略をエラーにしてくれないので、バグが起こることがとても多いのです。C#のswitch文のbreak省略禁止は、他の言語に対する優位性を示す例としてよく挙げられます。そのためC#を使うならswitch文を活用するべきなのです。

breakの代わりにreturnも使える

switch文のbreakは省略できませんが、breakの代わりにreturnを使うことはできます。以下がその例です。

実行すると2が表示されます。breakを使うよりもシンプルですね。ただしreturnしたらそこでGetValメソッドを抜けるので、その後の処理は実行されないことに注意してください。

enum列挙子を使ったswitch文

C#には列挙子という定数のグループを宣言できるルールがあります。この列挙子はswitch文と非常に相性が良いのです。以下のように使います。

これを実行すると以下が表示されます。

color is blue.

列挙子とswitch文を使えばわかりやすいプログラムを書けますね。

object変数の型による分岐

C#はobject型という、数値型でも文字列型でも代入できる便利な変数型があります。そしてswitch文はobject型の変数の実体によって分岐できるのです。具体的な例は以下の通りです。

実行結果は以下になります。

文字列 オブジェクト

型による分岐はwhen句を追加できる

caseにobject型の変数の型を指定した場合は、when句で条件を追加することができます。具体的には以下のようなコードになります。

結果は

under 5 value 3

になります。

when句を使う場合の注意

なお例えば以下のように、値によって複数のcaseが該当してしまう場合はどうなるのでしょうか。

この場合、objが5未満であれば”under 5″が戻ります。つまり上のcaseの方が優先されるのです。ただこのように値によって複数のcaseが該当する可能性がある場合は、if文を使用した方が分かりやすいコードになるでしょう。

複数の値のマッチングで分岐する

C#のswitch文は1つのcaseに複数の条件を指定することができます。以下が例です。

これを実行すると「太郎君、成人おめでとう」と表示されます。

switch文の中にswitch文を書く

上のような例は以下のようにすれば同じことが出来ます。

このように入れ子になることをネストと言います。C言語のような古くからある言語ではこのようにするのが普通です。しかしネストが何重にもなると非常に読みづらくバグが起こりやすいコードになります。caseに複数の条件が指定できるC#のswitch文はとても便利ですね。

式によるシンプルな表現

C#のswitch文は簡略化した記述をすることができます。以下に例を示します。

これを実行すると以下のようになります。

value is two.

caseではなく=>という表記を使います。valの値によって、strに入れる文字列を変えるという処理をこんなにシンプルに書けるのです。

おわりに

C#のswitch文についてご理解頂けましたでしょうか。C#のswitch文はC、C++、Javaといった他の言語に比べてバグが起こりにくいような配慮がされていて、かつそれらの言語よりも様々な記述が可能になっています。C#のswitch文を是非活用して、素晴らしいプログラムを作り上げてください。

C#エンジニア 案件・求人一覧はこちら

インフラエンジニア専門の転職サイト「FEnetインフラ」

FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。

転職をお考えの方は気軽にご登録・ご相談ください。

合わせて読みたい

C# でのforeach文の利用方法 hbspt.cta.load(20723875, 'd567c97b-58b2-483a-83fe-aec2e001739a', {"useNewLoader":"true","region":"na1"}); foreachとは? foreach文とは、配列やListに格...
C#のラムダ式は難しくない!実例でわかるC#のラムダ式でできること9つを紹介... hbspt.cta.load(20723875, 'd567c97b-58b2-483a-83fe-aec2e001739a', {"useNewLoader":"true","region":"na1"}); C#のラムダ式とは? C#のラムダ式(lambda expressions)...
C#のdelegateでできることは?便利な使い方やラムダ式についても紹介... hbspt.cta.load(20723875, 'd567c97b-58b2-483a-83fe-aec2e001739a', {"useNewLoader":"true","region":"na1"}); C#のdelegateとは? C#にはdelegateという文法があります。...
C#におけるSleep処理とは? hbspt.cta.load(20723875, 'd567c97b-58b2-483a-83fe-aec2e001739a', {"useNewLoader":"true","region":"na1"}); C#におけるSleep処理とは? Thread.Sleepメソッド C#の...
C#のusingを活用しよう! hbspt.cta.load(20723875, 'd567c97b-58b2-483a-83fe-aec2e001739a', {"useNewLoader":"true","region":"na1"}); C#のusingとは? C#のプログラミングをする方は、usingを活用...