【C#入門】switch-case文の使い方(数値、文字列で複数条件分岐)

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の使い方については、こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。

【C#入門】enumの値を文字列に変換する方法(属性の定義も解説)
更新日 : 2019年4月16日

複数条件を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文は条件によって処理を分ける数が多い場合に使うと便利です。原則フォールスルーが禁止されていますので、ご注意ください。

使いこなすことができるように、この記事を何度も参考にして下さいね!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説