息抜き C# ~ New Normal なコードの書き方:第02回「swtich式」 ~

f:id:ecb_smiyahara:20210303233805j:plain

こんにちはecbeingでアーキテクトをやっている宮原です。

今日は New Normal なコードの書き方 の第02回目、新しい「switch」の書き方について説明させていただきます。


本記事は 息抜きC# 記事の第02回目です。
第01回目「is演算子による型変換」はこちら。

switch文

switchは言わずとしれた条件分岐処理の一つです。
例を挙げるまでも無いでしょうが、ひとまず普通のswtch文をご覧下さい。

【普通のswitch文】
switch (hand)
{
    case 0:
        s = "グー";
        break;
    case 1:
        s = "チョキ";
        break;
    case 2:
        s = "パー";
        break;
    default:
        throw new InvalidOperationException();
}

switch文、break忘れがち問題

上記のコードがごく普通のswitch文のコードになります。
では皆さん、下記のコードの何が問題かわかりますか?

【コンパイラに怒られるswitch文】
switch (hand)
{
    case 0:
        s = "グー";
    case 1:
        s = "チョキ";
    case 2:
        s = "パー";
    default:
        throw new InvalidOperationException();
}


そう、上記のコードにはbreak文がありません。*1
まあ誰もが一度は上記のようなコードを書いてコンパイラに怒られる、という経験をしたことがあるはずです。

そして、コンパイラに怒られるたびに、「caseラベルを書くのすら面倒なのにbreak文まで書かなければならないのは非常に面倒じゃないか、うっかり忘れても仕方が無い」と必ず思うはずです*2

switch式

世の中、自分が考えることは他人も考えるものです。やはりswitch文についても私と同じようなことを誰かが考えたのでしょう。
C#にswitch文とは別にswitch式という書き方が加わりました。

【switch式】
string s = hand switch
{
    0 => "グー",
    1 => "チョキ",
    2 => "パー",
    _ => throw new InvalidOperationException(),
};

ありがたいことに、break文どころかcaseラベルまでなくなりました。

switch式の簡単な解説

上記switch文の「switch (hand)」に当たる部分が「hand switch」に変わり、「case 0:」に当たる部分は「0 => 」になっています*3
また、なくなった「break」の代わりに「,」が条件を分けていて、「default」の代わりに「_」を使用するようになっています。

switch式の注意点

一つ注意点としてはswitch式は「式」であるが故に値を持たなければなりません。
従って「=>」の後ろに来るのはすべて「値」となります*4
switch文の「case ○○:」の後の様にどんな文でも書けるわけではないので、従来のswitch文を全てswitch式に置き換えることは出来ません。なのでそこだけは気をつけて下さい。

switch式の利用シーン

switch文の利用方法として「ある値から別の値への変換」というのは非常にポピュラーでした。従って今後その様なswitch文を書く必要が出てきた時、switch式の利用を検討してみて下さい。そうすれば間違いなくコードがシンプルになることでしょう。

第03回目「型switch」はこちら

ecbeingでは新しい自分にswitchしたいエンジニアを募集しています!!

careers.ecbeing.tech

*1:「わかるも何も、タイトルに書いてあるじゃないか」というご指摘は、あなたの胸にそっとしまっておいて下さい。

*2:私だけではないはずだ!!

*3:個人的には「0 : 」になってくれていると更にありがたかったんですが、色々な事情によりそれは難しかったようです

*4:正確には「式」、値を返さない「文」は書けません