本サイトからスピンオフした姉妹サイトです。C#2016年3月15日オブジェクトの型を階層的に調べて分岐処理を行いたい場合がある。そのための機能として、C#の次バージョンでは「パターンマッチング」が追加される。前回に引き続き、C#に対する機能追加における大きなテーマである「データ処理」に沿った機能を紹介していこう。今回~次回で紹介する機能はパターンマッチングである。今回は前編として、パターンマッチングの構文の紹介や、具体的な用途、オブジェクト指向的な機能とのすみ分けなどについて説明していく。パターンマッチングパターンマッチングは、オブジェクトの型を階層的に調べて分岐処理を行うための構文である。is演算子とswitchステートメントの拡張として、これらの中にいくつかの「パターン」を書くことができる。最初に簡単な例を挙げておこう。リスト1およびリスト2に示すような構文になる。詳細は後々説明していくことになるが、この構文でできることは「型による分岐」と「型の分解」である。マッチングの例isやcaseキーワードの直後の部分が「パターン」である。リスト1は最も単純なパターンで、既存のis演算子と同様、オブジェクトの型を調べるだけのパターン、つまり型による分岐だ。パターンに合致した(=もしnの型がConst型だった)場合、変数cに型変換した結果が代入されるようになっている。リスト2は新たに導入されるswitch式を使ったパターンマッチングとなる。c)は、リスト1と同様の単純なパターンである。y)というパターンでは、変数nの型を調べるだけでなく、そのメンバーを抽出して使える。このパターンが型の分解に当たる。deconstruction)している。どの引数位置からどのメンバーを抽出するかを決める仕組みについては後編で説明する。このような構文は、F#やScalaなど、関数型言語ではよく採用されている構文だ。言って、関数型言語でないと実現できない/役に立たないものではない。これまでオブジェクト指向言語であまりパターンマッチングが見られなかったのは、オブジェクト指向的にはis演算子やキャストを使って型を調べるよりも、仮想関数(C#でいうとvirtual修飾子やabstract修飾子が付いたものや、インターフェースで定義されたメソッドやプロパティ)を使った分岐が好まれるからだろう。今後、恐らく両極端な意見、すなわち、「仮想関数があるのでパターンマッチングは要らない」と「オブジェクト指向的発想はダメだった。これからはパターンマッチング」というような意見も出てくるだろう。仮想関数にもパターンマッチングにも良い面があり、使い分けていくべきだろう。本題に入る前に、サンプルコード中でたびたび使うであろうクラスを提示しておこう。1」というような式を表すために使うデータ構造である。リスト3中の型の利用例ちなみに、同じくC#の次バージョンでの導入が検討されている「レコード型」と呼ばれる構文を使えば、リスト3のようなコードはかなりすっきりと書けるようになる。レコード型の詳細については次回以降で説明するが、リスト3のコードを、この構文を使って書き直した結果だけ紹介しておく。リスト4のようになる。リスト1をレコード型と呼ばれる機能を使って書き直したものパターンの種類パターンには表1に示すようなものがある。パターンの種類それぞれのパターンについて説明していこう。c)は、最初の例でも挙げた「最も単純なパターン」だ。既存のis演算子に近いが、型が合致した場合、その型に変換した結果を変数に受けられる。リスト5に示すように、これまでas演算子とnullチェックを通して行っていた処理を簡素に書けるようになる。as演算子を型パターンで置き換える例また、リスト6に示すように、null許容型のnullチェックを簡素化する目的でも使える。