変数の型によって処理を分岐したり、その際にキャストをしたりするのは、多くのプログラミング言語でよく行われることだ。C# 7ではこれをとても簡潔に記述できる。
Visual Studio 2017とともにリリースされたC# 7には多くの新機能がある。それらの新機能はどのような場面で役立つのだろうか? 3回にわたって紹介していく。
型によって分岐するコードは煩雑になりがちだ。今回は、それをきれいなコードにするのに役立つC# 7の新機能「パターンマッチング」を紹介する。
型によって分岐するコードとは、例えば次のコードのような場合だ(C# 6で記述)。
// 次への参照追加が必要:PresentationFramework、PresentationCore、WindowsBase
using System;
using System.Windows.Shapes;
using static System.Console;
class Program
{
public static void SampleMethod1(Shape s)
{
if (s is Ellipse) // 型を判定しても……
{
var e = s as Ellipse; // その型として使うにはキャストが必要
if (e.Width == e.Height)
WriteLine($"直径が{e.Width}の円です");
else
WriteLine("だ円です");
}
else if (s is Rectangle) // else ifが連続する
WriteLine("長方形です");
else if (s == null)
WriteLine("nullです");
else
WriteLine("それ以外の図形です");
}
[STAThread]
static void Main(string[] args)
{
SampleMethod1(new Ellipse { Width = 1.0, Height = 1.0, });
// 出力:直径が1の円です
SampleMethod1(new Ellipse { Width = 1.0, Height = 2.0, });
// 出力:だ円です
SampleMethod1(new Rectangle());
// 出力:長方形です
SampleMethod1(new Line());
// 出力:それ以外の図形です
SampleMethod1(null);
// 出力:nullです
#if DEBUG
ReadKey();
#endif
}
}
上のコードのSampleMethod1メソッドでは、is演算子で型を判定し、直後にas演算子でキャストしている。ここではサンプルということでキャストは1回しか登場していないが、実際にはもっと多いだろう。
このis演算子とas演算子の連続を避けるため、C# 6までは次のようなコードを書くこともあった。
Ellipse e;
if ((e = s as Ellipse) != null)
{
if (e.Width == e.Height)
WriteLine($"直径が{e.Width}の円です");
else
WriteLine("だ円です");
}
また、先のコードのSampleMethod1メソッドは、if〜else if〜が連続していて読みにくい。C# 6までは、次のコードのような工夫を凝らしてswitch文を使うこともあった。
public static void SampleMethod2(Shape s)
{
switch (s?.GetType().Name) // 文字列にすればswitchできる
{
case nameof(Ellipse):
var e = s as Ellipse; // やはり分岐後にキャストが必要
if (e.Width == e.Height) // 円とだ円の判定にはif文が必要
WriteLine($"直径が{e.Width}の円です");
else
WriteLine("だ円です");
break;
case nameof(Rectangle):
WriteLine("長方形です");
break;
case null:
WriteLine("nullです");
break;
default:
WriteLine("それ以外の図形です");
break;
}
}
このようにswitch文にすると少しは読みやすいだろう。それでも、いちいちキャストしなければならないことには変わりないし、全ての分岐をcaseラベルで書けないことも多い。
上の2つのコードに共通するのは、「型判定してキャストする」の繰り返しが多く登場するということだ(サンプルなのでキャストは1回にとどめているが、実際には頻繁に現れるはずだ)。
問題点を把握できたところで、C# 7の新機能を解説していこう。型判定してキャストするコードをシンプルに書けるし、型をそのまま使ってswitchもできるのだ。さらにそれ以外の機能もある。これらの新機能は、まとめて「パターンマッチング」と呼ばれている。
Copyright© Digital Advantage Corp. All Rights Reserved.