rksoftware

Visual Studio とか C# とかが好きです

C# 8 の確認 - 位置指定パターン

今回は 位置指定パターン 。この仕様は、前提として分解というおそらく、そんなに使われていない仕様が前提となっているためそんなに使われないのかもしれません。ただ、タプルパターンがあるなら会ってしかるべき納得の仕様だと思います。

公式はこちら

このブログでの目次?はこちら

分解

まずは、分解の例です。 Deconstruct という名前のメソッドを次のように実装すると、そのインスタンスをそれぞれの out 引数の値でタプルに代入できます。
この時の値の順番は、引数の順番です。

public class Point
{
    public int X { get; set; }
    public int Y { get; set; }
    public void Deconstruct(out int x, out int y) =>
        (x, y) = (X, Y);
}

static void Main(string[] args)
{
    var point = new Point { X = 1, Y = 2 };
    var (x, y) = point;
    // 1, 2 と出力される
    Console.WriteLine($"{x}, {y}");
}

位置指定パターン

分解結果のタプルで switch できます。

public class Point
{
    public int X { get; set; }
    public int Y { get; set; }
    public void Deconstruct(out int x, out int y) =>
        (x, y) = (X, Y);
}

static void Main(string[] args)
{
    var point = new Point { X = 1, Y = 2 };
    var val = point switch
    {
        var (x, y) when x == 0 && y == 1 => x,
        var (x, y) when x == 1 && y == 2 => x,
        var (x, y) when x == 2 && y == 3 => x,
        _ => -1
    };
    Console.WriteLine(val);
}

ちなみにここで、

var (x, y) when x == 0 && y == 1

という書き方が出えきましたが、これは普通に分解でないタプルでも同じ書き方ができます。

var point = (1, 2);
var val = point switch
{
    var (x, y) when x == 0 && y == 1 => x,
    var (x, y) when x == 1 && y == 2 => x,
    var (x, y) when x == 2 && y == 3 => x,
    _ => -1
};
Console.WriteLine(val);