C#
 Computer >> コンピューター >  >> プログラミング >> C#

C# 7.0のパターンマッチングとは?is式とswitch文の使い方を実例で解説

C# 7.0では、パターンマッチング(pattern matching)という新機能が導入されました。この機能は主に2つの場面、すなわちis式switchステートメントで利用できます。

パターンとは、ある値が特定の「形(shape)」を持っているかどうかを検査する仕組みです。値がパターンに一致した場合には、その値から情報を取り出すことも可能です。

パターンマッチングのメリット

  • より簡潔な構文:アルゴリズムを短く読みやすいコードで記述できます。
  • 任意のデータ型に対応:if/elseによる型判定ではプリミティブ型との比較が必要になる場面がありますが、パターンマッチングは独自に定義した型を含むあらゆるデータ型に対して使用できます。
  • 値の抽出:式の中から直接値を取り出せるため、型チェックとキャストを1行でまとめられます。

パターンマッチング以前のコード例

従来のC#では、型の確認にisを使い、その後asでキャストするという2段階の処理が必要でした。

public class PI{
    public const float Pi = 3.142f;
}
public class Rectangle : PI{
    public double Width { get; set; }
    public double height { get; set; }
}
public class Circle : PI{
    public double Radius { get; set; }
}
class Program{
    public static void PrintArea(PI pi){
        if (pi is Rectangle){
            Rectangle rectangle = pi as Rectangle;
            System.Console.WriteLine("Area of Rect {0}", rectangle.Width * rectangle.height);
        }
        else if (pi is Circle){
            Circle c = pi as Circle;
            System.Console.WriteLine("Area of Circle {0}", Circle.Pi * c.Radius * c.Radius);
        }
    }
    public static void Main(){
        Rectangle r1 = new Rectangle { Width = 12.2, height = 33 };
        Rectangle r2 = new Rectangle { Width = 12.2, height = 44 };
        Circle c1 = new Circle { Radius = 12 };
        PrintArea(r1);
        PrintArea(r2);
        PrintArea(c1);
        Console.ReadLine();
    }
}

出力結果

Area of Rect 402.59999999999997
Area of Rect 536.8
Area of Circle 452.44799423217773

このように従来の書き方では、「isで型を確認」してから「asでキャスト」するという処理が重複し、コードが冗長になりがちです。

パターンマッチング適用後のコード例

C# 7.0以降では、is式に変数宣言を組み合わせることで、型チェックとキャスト、そして新しい変数への代入を同時に行えます。

public class PI{
    public const float Pi = 3.142f;
}
public class Rectangle : PI{
    public double Width { get; set; }
    public double height { get; set; }
}
public class Circle : PI{
    public double Radius { get; set; }
}
class Program{
    public static void PrintArea(PI pi){
        if (pi is Rectangle rectangle){
            System.Console.WriteLine("Area of Rect {0}", rectangle.Width *
            rectangle.height);
        }
        else if (pi is Circle c){
            System.Console.WriteLine("Area of Circle {0}", Circle.Pi * c.Radius *
            c.Radius);
        }
    }
    public static void Main(){
        Rectangle r1 = new Rectangle { Width = 12.2, height = 33 };
        Rectangle r2 = new Rectangle { Width = 12.2, height = 44 };
        Circle c1 = new Circle { Radius = 12 };
        PrintArea(r1);
        PrintArea(r2);
        PrintArea(c1);
        Console.ReadLine();
    }
}

出力結果

Area of Rect 402.59999999999997
Area of Rect 536.8
Area of Circle 452.44799423217773

ポイントの解説

  • pi is Rectangle rectangle のように記述すると、piRectangle型である場合にのみ条件が真となり、同時にキャスト済みの値が変数rectangleに代入されます。
  • これにより、asによる明示的なキャストや、nullチェックのための余分なコードが不要になります。
  • 宣言された変数は、対応するifブロック内でのみスコープを持つため、安全に利用できます。

このように、C# 7.0のパターンマッチングを活用することで、型チェックと値の取得を一体化し、より簡潔で可読性の高いコードを書くことができるようになります。後続のバージョン(C# 8.0以降)ではswitch式などさらに強化されたパターンマッチングが提供されているため、基礎としてぜひ押さえておきましょう。

  1. IPアドレスとは?仕組み・種類・確認方法をわかりやすく解説

    IPアドレス(Internet Protocol address)とは、ネットワークに接続された機器を識別するための番号のことです。IPアドレスを持つことで、デバイスはインターネットに代表されるIPベースのネットワーク上で、他のデバイスと通信できるようになります。 IPアドレスの見た目 一般的なIPアドレスは、次のような形式で表記されます。 151.101.65.121 また、次のようにアルファベットを含む形式のIPアドレスを目にすることもあります。 2001:4860:4860::8844 IPアドレスの役割と仕組み IPアドレスは、インターネット上のネットワーク機器に対して「身元」を与える

  2. Windows 11 SEとは?教育向けOSの特徴・入手方法・対応アプリを徹底解説

    ChromebookとChrome OSが教育市場を大きく席巻する中、Microsoftは長年にわたりこの分野への本格参入を模索してきました。その切り札となるのが「Windows 11 SE」です。このOSはK-8(幼稚園〜中学校段階)の教室を想定して設計されており、使いやすさ、高いセキュリティ、そして低価格ながら性能が限られたPCへの適合性を重視しています。開発にあたってMicrosoftは、教育者、学校のIT担当者、管理者と緊密に連携しました。 Windows 11 SEは、同OS専用に設計された特別なデバイス上で動作することを前提としています。その代表格が、249ドルから提供されるMi