Switch式とは?
C#8.0で導入されたSwitch式は、従来のSwitch文をより簡潔に記述できる構文です。
具体的には、以下のような違いがあります。
相違点 | Switch文 | Switch式 |
---|---|---|
用途 | 複雑な処理 | 簡潔な処理 |
書き方 | 詳細な構文 | 簡潔な式 |
網羅性の確認 | 手動で行う | コンパイラが自動的に行う |
用途と書き方については、実際のコードを例に説明します。
以下は、int型の変数(number)の値に応じて異なる内容を出力するコードです。
// Switch文の場合
int number = 0;
switch (number)
{
case 1:
Console.WriteLine("One");
break;
case 2:
Console.WriteLine("Two");
break;
case 3:
Console.WriteLine("Three");
break;
default:
Console.WritrLine("Other number");
break;
}
// Switch式の場合
int number = 0;
string result = number switch
{
1 => "One",
2 => "Two",
3 => "Three",
_ => "Other number"
};
Console.WriteLine(result);
どうでしょうか?
Switch式の場合は、かなり簡潔にまとめられていると思います。
このように、Switch式はSwitch文と比較して簡潔な処理に向いているといえます。
また、Switch式のコードでdefaultとして扱っている「 _ 」は、
ディスカードと呼ばれているもので、「値を破棄するための特別な変数」を意味します。
Switch式ではSwitch文の「default」にあたる「その他すべて」を表し、
下記のような場合にも使用することが出来ます。
// タプルから特定の値だけを取り出し、不要な値を無視する場合
var (x, _, z) = (1, 2, 3);
Console.WriteLine(x);
Console.WriteLine(z);
// メソッドのoutパラメーターに用いて、不要な値を破棄する場合
if (int.TryParse("123", out _))
{
Console.WriteLine("Success!.")
}
話が逸れましたが、Switch文とSwitch式の違いに戻ります。
最後に網羅性の確認についてですが、以下のような違いがあります。
Switch文の場合は、コンパイラが自動的に確認しないため、
漏れがあった場合は実行時エラーになる可能性があります。
Switch式の場合は、コンパイラが全ての条件を確認するので、
漏れがあった場合はエラーや警告を表示してくれます。
以上がSwitch文とSwitch式の違いになります。