0Pricing
C# Academy · レッスン

switch式

値を返す簡潔なswitchを学びます。

「switch式」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

switch 式とは

switch 式は、入力を一連のパターンと照合し、値を返します。従来のswitchステートメントとは異なり、これは式なので、結果を代入したり返したりできます。

値の後ろにswitchキーワードを置き、アームをpattern => resultの形式で記述します。これにより、分岐ロジックを簡潔かつ関数的に表現できます。

int code = 2;
string name = code switch
{
    1 => "One",
    2 => "Two",
    _ => "Other"
};
System.Console.WriteLine(name);

ステートメントと式の違い

従来のswitch ステートメントでは、caseラベルとbreakを使用します。新しいswitch 式では、これらのキーワードを完全に省略します。

アームはコンマで区切り、全体をセミコロンで終えます。また、各アームはフォールスルーするブロックを実行するのではなく、値を生成します。これにより、breakの書き忘れによるバグを防げます。

// Statement style
switch (code) { case 1: result = "One"; break; }

// Expression style
result = code switch { 1 => "One", _ => "?" };

破棄アーム

アンダースコア_は、破棄パターンです。あらゆる値に一致し、既定のケースとして機能します。

switch式では、すべてのケースを網羅的に扱う必要があります。実行時にどのアームにも一致しないと、SwitchExpressionExceptionがスローされます。_アームを追加すると、考えられるすべての入力に必ず一致します。

using System;

class Program {
    static void Main() {
        int n = 7;
        string size = n switch {
            < 5 => "small",
            _ => "big"
        };
        Console.WriteLine(size);
    }
}

定数パターン

最も単純なアームでは、定数パターンを使用します。これは、等価性によって入力と比較するリテラル値です。

定数には、数値、文字列、文字、列挙型メンバー、名前付き定数を使用できます。上から下の順に評価されるため、より具体的なアームや、より頻繁に使用するアームを先に配置してください。

char grade = 'B';
string label = grade switch
{
    'A' => "Excellent",
    'B' => "Good",
    'C' => "Fair",
    _   => "Needs work"
};
System.Console.WriteLine(label);

メソッドから値を返す

switch式は、メソッド内で特に力を発揮します。構造全体が式であるため、returnで直接返すことができ、多くの場合、1行の式形式メソッドとして記述できます。

これにより、マッピングロジックを本体中の複数のif/else ifチェーンに分散させず、読みやすく一元化できます。

using System;

class Program {
    static string Day(int d) => d switch {
        0 => "Sun", 6 => "Sat", _ => "Weekday"
    };
    static void Main() => Console.WriteLine(Day(6));
}

列挙型での切り替え

列挙型はswitch式と自然に組み合わせられます。各アームで列挙型メンバーを指定し、破棄アームを省略すると、ケースが不足している場合にコンパイラーが警告を出せます。

それでも、将来列挙型に値が追加されたときにアプリが実行時にクラッシュしないよう、_アームを残しておくのが賢明です。

using System;

enum Light { Red, Yellow, Green }

class Program {
    static void Main() {
        Light l = Light.Green;
        string action = l switch {
            Light.Red => "Stop",
            Light.Yellow => "Slow",
            Light.Green => "Go",
            _ => "?"
        };
        Console.WriteLine(action);
    }
}

when によるガード句

whenガードを使うと、アームにブール条件を追加できます。パターンとガードの両方がtrueの場合にだけ、アームが一致します。

これにより、パターンだけでは表現できない任意のロジックで一致条件を絞り込めます。たとえば、範囲チェックを他の変数と組み合わせることができます。

int temp = 30;
string weather = temp switch
{
    int t when t < 0  => "Freezing",
    int t when t < 20 => "Cool",
    _                 => "Warm"
};
System.Console.WriteLine(weather);

順序が重要

アームはソースコードに記述された順序でテストされます。最初に一致したアームが選ばれるため、より具体的なパターンを、より広いパターンより前に置く必要があります。

一般的なアームを具体的なアームより前に置くと、コンパイラーは後のアームを到達不能と報告します。アームは、狭い条件から広い条件へと広がる漏斗のように、上から下へ読みましょう。

int score = 95;
string tier = score switch
{
    >= 90 => "Gold",
    >= 70 => "Silver",
    _     => "Bronze"
};
System.Console.WriteLine(tier);

網羅性と例外

すべての入力がカバーされておらず、どのアームにも一致しない場合、実行時にSystem.Runtime.CompilerServices.SwitchExpressionExceptionがスローされます。

コンパイラーは、網羅性を証明できない場合に警告CS8509を出力します。この警告を軽視しないでください。欠落している値をカバーするか、破棄アームを追加して、式がすべてのケースを扱えるようにします。

using System;

class Program {
    static void Main() {
        try {
            int x = 5;
            string s = x switch { 1 => "a", 2 => "b" };
            Console.WriteLine(s);
        } catch (Exception e) {
            Console.WriteLine(e.GetType().Name);
        }
    }
}

複数の入力の組み合わせ

複数の値を対象に切り替えるには、それらをタプルで囲みます。するとアームではタプルパターンを使い、各位置を比較できます。

これは、結果が2つの要素に依存する状態機械や決定表に適しています。タプルパターンについては、後のレッスンで詳しく説明します。

bool isWeekend = true; bool isRaining = false;
string plan = (isWeekend, isRaining) switch
{
    (true, false) => "Go hiking",
    (true, true)  => "Watch a movie",
    _             => "Work"
};
System.Console.WriteLine(plan);

読みやすい式形式メンバー

switch式はLINQや式形式メンバーとうまく組み合わせられ、簡潔なパイプラインを作成できます。

各アームが値を返すため、switch式をSelectの射影の中やメソッドの引数として直接使用でき、一時変数を避けられます。

using System;
using System.Linq;

class Program {
    static void Main() {
        var nums = new[] { 1, 2, 3 };
        var labels = nums.Select(n => n switch {
            1 => "one", 2 => "two", _ => "many"
        });
        Console.WriteLine(string.Join(",", labels));
    }
}

クイックチェック

switch式についての理解度を確認しましょう。

まとめ

switch式は、コンマで区切ったアームを持つinput switch { pattern => result, ... }によって値を返します。

既定のケースには_、ガードにはwhenを使用し、アームが上から下へテストされることを覚えておきましょう。実行時例外を避けるため、すべてのケースを網羅してください。次は型パターンとプロパティパターンを取り上げます。

よくある質問

「switch式」レッスンは無料ですか?

はい。「switch式」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「switch式」で何を学びますか?

値を返す簡潔なswitchを学びます。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「switch式」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. switch式
  2. 型パターンとプロパティパターン
  3. 関係パターンと論理パターン
  4. リストパターンとタプルパターン
← C# Academyに戻る