こんにちは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式の利用を検討してみて下さい。そうすれば間違いなくコードがシンプルになることでしょう。
ecbeingでは新しい自分にswitchしたいエンジニアを募集しています!!