BT

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拡張メソッドがある場合に、どちらが優先されるかである。理想的には、それらは同じ値を返すが、そうでない場合はタイブレーカーが必要である。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

BT

あなたのプロファイルは最新ですか?プロフィールを確認してアップデートしてください。

Eメールを変更すると確認のメールが配信されます。

会社名:
役職:
組織規模:
国:
都道府県:
新しいメールアドレスに確認用のメールを送信します。このポップアップ画面は自動的に閉じられます。