C#8.0で追加されたswitch式の使い方を解説

C# 8.0で導入されたswitch式は、従来のswitch文をより簡潔に記述できる構文です。

switch式は式として評価され、結果を返すため、変数の代入や戻り値として使用できます。

従来のswitch文と異なり、各ケースでブロックを使わず、矢印=>を用いて結果を直接返します。

また、パターンマッチングと組み合わせることで、型や条件に応じた処理を簡潔に記述できます。

この記事でわかること
  • switch式の基本的な使い方
  • パターンマッチングの活用法
  • switch式の応用例と注意点
  • switch式とswitch文の違い
  • 例外処理の方法と注意点

目次から探す

switch式とは

C# 8.0で導入されたswitch式は、従来のswitch文に代わる新しい構文で、より簡潔で表現力豊かな条件分岐を実現します。

switch式は、値を返す式として機能し、より直感的に条件を評価することができます。

switch文との違い

スクロールできます
特徴switch文switch式
戻り値なし値を返す
構文の簡潔さ複雑な場合がある簡潔で読みやすい
使用目的主に制御フロー値の評価と代入

switch文は制御フローを管理するために使用されますが、switch式は値を返すため、より柔軟な使い方が可能です。

switch式の基本構文

switch式の基本構文は以下のようになります。

var result = value switch
{
    pattern1 => result1,
    pattern2 => result2,
    _ => defaultResult
};

この構文では、valueに基づいて、各パターンにマッチした場合に対応する結果が返されます。

_はデフォルトケースを示します。

switch式のメリット

  • 簡潔さ: 複数の条件を簡潔に記述でき、可読性が向上します。
  • パターンマッチング: 型や条件に基づくパターンマッチングが可能で、より強力な条件分岐が実現できます。
  • 戻り値の明示性: 値を直接返すため、結果を変数に代入する際に便利です。

これらのメリットにより、switch式はC#プログラミングにおいて非常に有用な機能となっています。

switch式の基本的な使い方

C# 8.0のswitch式は、さまざまな場面で活用できます。

ここでは、基本的な使い方を具体的に見ていきましょう。

変数への代入で使う

switch式は、条件に基づいて変数に値を代入する際に非常に便利です。

以下の例では、整数の値に応じて文字列を代入しています。

int number = 2;
string result = number switch
{
    1 => "一",
    2 => "二",
    3 => "三",
    _ => "その他"
};
Console.WriteLine(result);

この例では、numberの値が2の場合、resultには「二」が代入されます。

戻り値として使う

switch式は、メソッドの戻り値としても使用できます。

以下の例では、文字列を受け取り、その長さに応じたメッセージを返します。

string GetMessage(string input) =>
    input switch
    {
        "" => "空の文字列です",
        var s when s.Length < 5 => "短い文字列です",
        _ => "長い文字列です"
    };
Console.WriteLine(GetMessage("テスト"));
短い文字列です

この例では、入力された文字列の長さに応じて異なるメッセージが返されます。

矢印(=>)を使った簡潔な記述

switch式では、矢印(=>)を使って簡潔に条件と結果を記述できます。

以下の例では、曜日に応じたメッセージを返します。

string day = "月曜日";
string message = day switch
{
    "月曜日" => "週の始まり",
    "金曜日" => "週の終わり",
    "土曜日" => "週末",
    "日曜日" => "休息日",
    _ => "平日"
};
Console.WriteLine(message);
週の始まり

このように、矢印を使うことで、条件と結果を明確に分けて記述できます。

デフォルトケースの指定

switch式では、すべてのケースにマッチしない場合のデフォルトケースを指定することができます。

以下の例では、数値に応じたメッセージを返し、デフォルトケースを設定しています。

int score = 85;
string grade = score switch
{
    >= 90 => "優",
    >= 80 => "良",
    >= 70 => "可",
    _ => "不可"
};
Console.WriteLine(grade);

この例では、scoreが80以上の場合に「良」が返され、すべての条件にマッチしない場合は「不可」が返されます。

デフォルトケースを設定することで、予期しない値に対する処理を行うことができます。

パターンマッチングとswitch式

C# 8.0のswitch式は、パターンマッチングを活用することで、より柔軟で強力な条件分岐を実現します。

ここでは、さまざまなパターンマッチングの使い方を見ていきましょう。

型パターンの使用

型パターンを使用すると、オブジェクトの型に基づいて条件分岐を行うことができます。

以下の例では、異なる型のオブジェクトに対して処理を行っています。

object obj = "Hello, World!";
string message = obj switch
{
    string s => $"文字列: {s}",
    int i => $"整数: {i}",
    _ => "未知の型"
};
Console.WriteLine(message);
文字列: Hello, World!

この例では、objが文字列の場合にその内容を表示し、整数の場合には整数を表示します。

条件パターンの使用

条件パターンを使用すると、特定の条件を満たす場合に処理を行うことができます。

以下の例では、数値が偶数か奇数かを判定しています。

int number = 7;
string result = number switch
{
    var n when n % 2 == 0 => "偶数",
    var n when n % 2 != 0 => "奇数",
    _ => "不明"
};
Console.WriteLine(result);
奇数

この例では、numberが奇数の場合に「奇数」と表示されます。

タプルパターンの使用

タプルパターンを使用すると、複数の値を同時に評価することができます。

以下の例では、2つの整数の組み合わせに応じてメッセージを返します。

(int x, int y) = (1, 2);
string result = (x, y) switch
{
    (0, 0) => "原点",
    (var a, var b) when a == b => "対角線上",
    _ => "その他"
};
Console.WriteLine(result);
その他

この例では、タプルの値に応じて異なるメッセージが返されます。

when句を使った条件付きパターン

when句を使用することで、特定の条件を満たす場合にのみパターンを適用することができます。

以下の例では、数値が特定の範囲にあるかどうかを判定しています。

int score = 75;
string grade = score switch
{
    var s when s >= 90 => "優",
    var s when s >= 80 => "良",
    var s when s >= 70 => "可",
    _ => "不可"
};
Console.WriteLine(grade);

この例では、scoreが70以上の場合に「可」と表示されます。

when句を使うことで、より詳細な条件を指定することが可能です。

switch式の応用例

C# 8.0のswitch式は、さまざまな場面で応用が可能です。

ここでは、具体的な応用例をいくつか紹介します。

列挙型(enum)との組み合わせ

列挙型を使用することで、特定の状態やカテゴリに基づいた条件分岐が簡単に行えます。

以下の例では、列挙型を使って異なるメッセージを返します。

using System;

class Program
{
    static void Main()
    {
        Weather today = Weather.Sunny;
        string message = today switch
        {
            Weather.Sunny => "今日は晴れです。",
            Weather.Rainy => "今日は雨です。",
            Weather.Cloudy => "今日は曇りです。",
            Weather.Snowy => "今日は雪です。",
            _ => "天気情報が不明です。"
        };
        Console.WriteLine(message);
    }
}

enum Weather
{
    Sunny,
    Rainy,
    Cloudy,
    Snowy
}
今日は晴れです。

この例では、todayの値に応じて異なる天気のメッセージが表示されます。

nullチェックを含むswitch式

nullチェックを行うことで、オブジェクトがnullであるかどうかを判定し、適切な処理を行うことができます。

以下の例では、文字列がnullかどうかをチェックしています。

string? input = null;
string result = input switch
{
    null => "入力はnullです。",
    "" => "空の文字列です。",
    var s => $"入力された文字列: {s}"
};
Console.WriteLine(result);
入力はnullです。

この例では、inputがnullの場合に「入力はnullです。」と表示されます。

複数の条件をまとめたswitch式

複数の条件をまとめて処理することも可能です。

以下の例では、数値が特定の範囲にあるかどうかを判定しています。

int score = 85;
string grade = score switch
{
    >= 90 => "優",
    >= 80 => "良",
    >= 70 => "可",
    _ => "不可"
};
Console.WriteLine(grade);

この例では、scoreが80以上の場合に「良」と表示されます。

複数の条件をまとめることで、コードが簡潔になります。

複雑な条件分岐の簡略化

switch式を使用することで、複雑な条件分岐を簡略化できます。

以下の例では、複数の条件を組み合わせて処理を行っています。

int age = 20;
bool hasLicense = true;
string result = (age, hasLicense) switch
{
    (var a, true) when a >= 18 => "運転可能",
    (var a, false) when a >= 18 => "運転免許が必要",
    _ => "運転不可"
};
Console.WriteLine(result);
運転可能

この例では、年齢と運転免許の有無に基づいて運転可能かどうかを判定しています。

switch式を使うことで、複雑な条件分岐をシンプルに表現できます。

switch式の注意点

C# 8.0のswitch式は非常に便利ですが、使用する際にはいくつかの注意点があります。

ここでは、主な注意点を解説します。

式としての評価に注意

switch式は、式として評価されるため、すべてのケースが正しく評価される必要があります。

以下の例では、すべてのケースを考慮しないと、意図しない結果を招く可能性があります。

int number = 5;
string result = number switch
{
    1 => "一",
    2 => "二",
    3 => "三",
    // 4のケースを省略
    _ => "その他"
};
Console.WriteLine(result);
その他

この例では、numberが4の場合のケースが省略されているため、デフォルトの「その他」が返されます。

意図しない結果を避けるために、すべてのケースを網羅することが重要です。

すべてのケースを網羅する必要性

switch式では、すべての可能なケースを網羅することが推奨されます。

特に、デフォルトケースを設定しない場合、未処理のケースがあると、実行時エラーが発生する可能性があります。

以下の例では、デフォルトケースを設定していないため、未処理のケースがあるとエラーになります。

int number = 10;
string result = number switch
{
    1 => "一",
    2 => "二",
    3 => "三"
    // デフォルトケースがない
};
Console.WriteLine(result); // 実行時エラー

このように、すべてのケースを網羅するか、デフォルトケースを設定することが重要です。

パフォーマンスへの影響

switch式は、条件分岐を簡潔に記述できる一方で、パフォーマンスに影響を与える場合があります。

特に、条件が多くなると、評価にかかる時間が増加する可能性があります。

以下の例では、条件が多い場合のパフォーマンスに注意が必要です。

int number = 100;
string result = number switch
{
    1 => "一",
    2 => "二",
    // ... 省略 ...
    100 => "百",
    _ => "その他"
};
// パフォーマンスに影響を与える可能性がある
Console.WriteLine(result);

このように、条件が多くなると、switch式の評価に時間がかかることがあります。

特に、パフォーマンスが重要なアプリケーションでは、条件の数を最小限に抑えることが推奨されます。

よくある質問

switch式とswitch文はどちらを使うべき?

switch式とswitch文は、それぞれ異なる目的に適しています。

以下のポイントを考慮して選択することが重要です。

  • switch式:
  • 値を返す必要がある場合に適しています。
  • より簡潔で読みやすいコードを書くことができます。
  • パターンマッチングを活用でき、複雑な条件分岐を簡略化できます。
  • switch文:
  • 副作用がある処理(例えば、変数の値を変更するなど)を行う場合に適しています。
  • 複数の処理を行う必要がある場合に便利です。

一般的には、値を返す必要がある場合はswitch式を、制御フローを管理する場合はswitch文を使用することが推奨されます。

switch式で例外処理はどう行う?

switch式自体には例外処理の機能はありませんが、例外処理を行うためには、try-catchブロックを使用することができます。

以下の例では、switch式を使用しつつ、例外処理を行っています。

int number = 5;
try
{
    string result = number switch
    {
        1 => "一",
        2 => "二",
        3 => "三",
        _ => throw new ArgumentOutOfRangeException(nameof(number), "範囲外の値です。")
    };
    Console.WriteLine(result);
}
catch (ArgumentOutOfRangeException ex)
{
    Console.WriteLine(ex.Message);
}

この例では、numberが1、2、3以外の値の場合に例外をスローし、catchブロックでその例外を処理しています。

switch式を使用する際に、必要に応じてtry-catchブロックを組み合わせることで、例外処理を行うことができます。

まとめ

この記事では、C# 8.0で導入されたswitch式の基本的な使い方や、パターンマッチングとの組み合わせ、応用例、注意点について詳しく解説しました。

switch式は、条件分岐をより簡潔に表現できる強力な機能であり、特にパターンマッチングを活用することで、複雑な条件をシンプルに扱うことが可能です。

これを機に、実際のプログラミングにおいてswitch式を積極的に活用し、コードの可読性や保守性を向上させてみてはいかがでしょうか。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • 条件分岐 (11)
  • 繰り返し文 (11)
  • URLをコピーしました!
目次から探す