Deep C# vol.4 – switch expression

はじめに

この記事はDeep C# vol.3 – await usingに続く記事となります。
第4回 Deep C# は switch-expression(switch式) を分析します。

switch式とは

C#7以降、パターンマッチングの一環として switch を式として書くことが出来る拡張も行われてきました。これは switch式 / switch expression と呼ばれています。
一般には「switch式」と呼ばれることが多いようです。
switch式はこのように記述します。

従来の switch文 と比較すると case: - break; の必要がないサッパリとしたコードを記述できるメリットがあります。
そして、パターンマッチングの進歩とともに caseに相当する部分には 型、値、条件式などを記述することが出来るようになりました。

switch式を解体する

パターンマッチングの複雑性が原因で、switch式 は逆コンパイル時に switch式/switch文には変換できないようになってしまいました。見る影もありません。
逆コンパイルすると大量の if - elsegoto が出力されます。

まず、最初に型判定を行うif文が並びます。その中に値の比較や when に書かれた条件式の判定が入ります。
最後にそれらを式の内容で変換して、value 変数に格納し、後続処理に続きます。
default 相当の処理はスコープの末尾に展開されており goto で行き来します。
コンパイラーの出力は、最も軽量なコードを目指していますので、この goto を用いたコンパイル結果は正しいものだと言えます。
途中、if (1 == 0) { } という謎のコードを2つ見つけましたが、これは実行時の最適化で消えるので無害です。

まとめ

パターンマッチング自体は型、値、式などを判定する if文に変換するものでした。
switch式は、switch文を短く書くことが出来るケースならば積極的に活用したいものです。
同じ内容の switch文を考えるとかなりの記述量を圧縮できることがわかるはずです。

またこれまでの Deep C# で扱ってきたものと同様、.NET の仕様自体には変更を加えず、コードの出力の工夫で新しい構文を実現していることが分かります。
他のさまざまな構文がどのような C# に展開されるかを理解することは、言語のより深い理解を意味します。
今後も Deep C# はこの方向を突き詰めていく予定です。

次回は yield return です。ご期待ください。

最近の記事

  • 関連記事
  • おすすめ記事
  • 特集記事

アーカイブ

カテゴリー

PAGE TOP