息抜き C# ~ New Normal なコードの書き方:第03回「型switch」 ~

f:id:ecb_smiyahara:20210303234303j:plain

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

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


本記事は 息抜きC# 記事の第03回目です。
第02回目「swtich式」はこちら。

型による条件分岐

「明示的に型を見て条件分岐するのはオブジェクト指向の負け」
という風潮もあるはあるこの界隈ですが、そうも言ってられない場合があるのがこの業界です*1

if文で条件分岐

第01回でも触れましたが、C#で型判定といえば「is演算子」です。
if文で is演算子 を使えば型判定が可能であり、想定される型が何パターンかあるならば、if文をelse でつなげていくつも書いて条件分岐することが出来ます。

【ifを使った型による条件分岐】
if (o is int)
{
    Console.WriteLine("intでした");
}
else if (o is double)
{
    Console.WriteLine("doubleでした");
}
else if (o is string)
{
    Console.WriteLine(o);// string型ならそのまま出力
}
else
{
    throw new InvalidOperationException();
}
ifを使った型による条件分岐の厄介なところ

しかし、上記の書き方は若干厄介な部分があります。

  1. if文のたびに「o is ~」と書かなければいけない
  2. 条件が合致した場合の処理を中括弧で囲まなければならない*2

switch文で条件分岐

「変数1つの型を判定するなら、if文じゃなくてswitch文でもいいんじゃないか?」と誰かが考えたのでしょう。

変数の値ではなく型によってswitchが出来るようになりました。

【型によるswitch文】
switch (o)
{
    case int:
        Console.WriteLine("intでした");
        break;
    case double:
        Console.WriteLine("doubleでした");
        break;
    case string:
        Console.WriteLine(o);// string型ならそのまま出力
        break;
    default:
        throw new InvalidOperationException();
}

これで全ての条件でごとに変数を書く必要がなくなり、また条件合致時の処理も中括弧で囲む必要がなくなりました。

さらに、第02回で紹介しましたswitch式をでも型switchが可能です。

【型によるswitch式】
string s = o switch
{
    int => "intでした",
    double => "doubleでした",
    string o2s => o2s,
    _ => throw new InvalidOperationException(),
};
Console.WriteLine(s);

ここで注目すべきは「string o2s => o2s,」の部分です。
この「string o2s 」の部分は第01回の「is演算子の拡張」と同じ仕組みにより、型判定と型変換と変数宣言を同時に行っています。is演算子で必要な「~ is」の部分がswitch式*3であることにより省略されているのですね。

いきなりはよくない

さて、非常に短く書くことが出来ましたが、いきなりif文で行っていた型判定から型switch式への書き換えは頭がなかなか追いつかないかもしれません。

その場合はまず、型switch文とswitch式に慣れて下さい。
それらに十分親しんできたら型switch式を取り入れることをお勧めいたします。

何事も段階を踏むことが大事です。

第04回目「null許容参照型」はこちら

ecbeingでは段階を踏んでスキルアップしたいエンジニアを募集しています!!

careers.ecbeing.tech

*1:例えばデシリアライズのときなど

*2:単文だと囲まなくてもいいのですが、それはまた別のお話ということで・・・

*3:実はswitch文でも同じことが出来ます