is演算子、switch文の拡張としてパターンマッチング機能がC#7で追加されました。
null比較や型比較が新たに可能になったので実際にやってみようと思います。
is演算子、switch文共に拡張された内容は同じような感じです。
まず、is演算子です。
// is拡張
// 定数との比較ができる。
if (obj is null)
{
Console.WriteLine("NULL");
}
else if (obj is int.MaxValue)
{
Console.WriteLine(string.Format("int MaxValue = {0}", obj));
}
// 該当する型の場合のみ、変数に変換できる。
else if (obj is string str)
{
Console.WriteLine(string.Format("String value = {0}", str));
}
// varでの比較ができる。
else if (obj is var tmp)
{
Console.WriteLine(tmp.ToString());
}
個人的にはint.MaxValueのような定数との比較、型比較の際に変数にキャストできるのが便利だなと思います。
次に、switch文です。
// switch文拡張
switch (obj)
{
// 該当する型の場合のみ、変数に変換できる。
case string str when (str != "bug"):
Console.WriteLine(str);
break;
case int i:
Console.WriteLine(i);
break;
// varから派生するパターンでも利用可能
case var tmp when ((tmp != null) && Enum.IsDefined(typeof(DayOfWeek), tmp)):
Console.WriteLine(tmp.ToString());
break;
case var tmpNull when (tmpNull == null):
Console.WriteLine("NULL");
break;
default:
break;
}
is演算子拡張とほぼ同じ内容であることがわかると思います。
どちらも知っていればすごく便利ですね。