BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース C# 8パターンマッチングの機能強化

C# 8パターンマッチングの機能強化

原文(投稿日:2019/06/19)へのリンク

C# 7はパターンマッチングの基礎を築いたが、多くの機能はCutting Room Floorに置いたままにせざるを得なかった。C# 8で追加の時間をかけて、これらのうちの多くが採用されている。

位置パターンマッチング

C# 7構文を使った、このかなり冗長なパターンを考えてみよう。

case Rectangle r when r.Length == 10 && r.Width == 10: return "Found 10x10 rectangle";

デコンストラクタ機能を利用することで、新しい位置パターンマッチングにより、機能の冗長度が大幅に低下する。

case Rectangle (10, 10): return "Found 10x10 rectangle";

この機能は匿名タプルでもサポートされる。これは「タプルパターン」と呼ばれまる。この例はMadの記事C# 8.0のパターンでもっと多くをしようで参照できる。

特性パターンマッチング

位置パターンは簡潔であるが、適切なDeconstructメソッドがある場合にのみ機能する。ない場合は、代わりにプロパティパターンを使用できる。

case Rectangle {Width : 10 }: return "Found a rectangle with a width of 10";

インデックス付きプロパティのサポートも検討されているが、詳細は決定されていない。

デコンストラクタの改善

パターンマッチングで未解決のLDMの問題チケットの下で検討されている別のアイデアは、同じ数のパラメータを持つ、複数のDeconstructメソッドを許可することである。異なる型を持つことに加えて、パラメータは異なる名前を付ける必要がある。

ITupleパターンマッチング

.NET 4.7.1および.NET Core 2.0で導入されたITupleインターフェイスは、C# 8でいくつか質問がある。基本的な考え方は、オブジェクトがこのインターフェイスを実装すれば、パターンマッチングに参加できるということである。これがいつ有効になるかについて、3つのシナリオが検討中である。

if (x is ITuple(3, 4)) // (1) permitted?
if (x is object(3, 4)) // (2) permitted?
if (x is SomeTypeThatImplementsITuple(3, 4)) // (3) permitted?

関連する質問として、クラスがITupleを実装していて、Deconstruct拡張メソッドがある場合に、どちらが優先されるかである。理想的には、それらは同じ値を返すが、そうでない場合はタイブレーカーが必要である。

この記事に星をつける

おすすめ度
スタイル

BT