C# 8.0 で導入された「switch式(Switch Expressions)」を使用すると、従来の switch 文よりも簡潔で直感的な記述が可能になります。
従来の switch 文は「制御構造(ステートメント)」でしたが、switch式は「式(Expression)」であるため、結果を直接変数に代入したり、メソッドの戻り値として返すことができます。これにより、コードの行数を大幅に削減し、可読性を向上させることができます。
本記事では、System.IO.DriveType 列挙型を用いてドライブの種類を判定するコードを例に、switch式の基本的な構文と使い方を解説します。
実装例:ドライブ種類の判定
以下は、指定されたドライブの種類(列挙型)に応じて、対応する日本語名称を文字列として取得するプログラムです。
using System;
using System.IO;
namespace SwitchExpressionExample
{
class Program
{
static void Main(string[] args)
{
// 判定対象のドライブタイプ(例: ネットワークドライブ)
DriveType currentDrive = DriveType.Network;
// switch式を利用した判定ロジック
// 結果を直接変数 'driveInfo' に代入できる
string driveInfo = currentDrive switch
{
DriveType.Fixed => "固定ディスク (HDD/SSD)",
DriveType.Network => "ネットワークドライブ",
DriveType.Removable => "リムーバブルディスク (USBメモリ等)",
DriveType.CDRom => "光ディスクドライブ",
DriveType.Ram => "RAMディスク",
// アンダースコア (_) は default ケースに相当する「破棄パターン」
_ => "その他のドライブ"
};
Console.WriteLine($"判定結果: {driveInfo}");
// 参考: メソッドの戻り値として直接記述する場合の例
Console.WriteLine(GetStatusMessage(200));
}
// switch式はメソッドの戻り値としても非常に使いやすい
static string GetStatusMessage(int statusCode) => statusCode switch
{
200 => "成功",
404 => "見つかりません",
500 => "サーバーエラー",
_ => "不明なステータス"
};
}
}
解説とポイント
1. 基本構文の変化
従来の case : や break; といったキーワードが不要になり、代わりにアロー演算子 => を使用します。
- 従来:
case DriveType.Fixed: result = "固定"; break; - switch式:
DriveType.Fixed => "固定",
各アーム(分岐)はカンマ , で区切ります。
2. defaultケース(破棄パターン)
従来の default: ラベルの代わりに、アンダースコア _ を使用します。これは「破棄パターン(Discard Pattern)」と呼ばれ、どの条件にも一致しなかった場合の処理を記述します。 switch式は値を返す必要があるため、すべてのパターンを網羅するか、この破棄パターンを用意する必要があります。
3. 式としての利用
コード例の GetStatusMessage メソッドのように、switch式は評価結果として値を返すため、メソッド定義の =>(式形式のメンバー定義)と組み合わせることで、非常にコンパクトなメソッドを作成できます。
まとめ
switch式を利用することで、条件分岐のロジックを宣言的かつシンプルに記述できます。
- 構文:
変数 switch { パターン => 値, _ => デフォルト値 }; - メリット: 行数の削減、
break漏れの防止、変数への直接代入が可能。
C# 8.0 以降の環境であれば、単純な値の変換やマッピング処理において、従来の switch 文よりも積極的に switch式を使用することを推奨します。
