[C# class] ユーザー定義型の分解について(Deconstructメソッド)

クラス、構造体、インターフェースにDeconstructメソッドを実装するとインスタンスを分解して複数の値にすることができます。

うん、よくわからないですね!とりあえずサンプルコードを見てください。

スポンサーリンク

Deconstructメソッドを実装して分解してみる

こんな感じです。

using System;

class Sample
{ 
    public int Property1 { get; set; }
    public int Property2 { get; set; }
    public string Property3 { get; set; }

    // Deconstructメソッドの実装
    public void Deconstruct(out int prop1, out int prop2, out string prop3)
    {
        prop1 = this.Property1;
        prop2 = this.Property2;
        prop3 = this.Property3;
    }
}

class Program
{
    public static void Main()
    {
        // クラスのインスタンスを作成
        var cls = new Sample { Property1 = 10, Property2 = 20, Property3 = "abc" };

        // クラスを分解してそれぞれの値を取り出す
        var (value1, value2, value3) = cls;

        // 取り出した値を表示
        Console.WriteLine($"value1={value1}, value2={value2}, value3={value3}");
    }
}
value1=10, value2=20, value3=abc

26行目が分解しているところです。分解した値を各変数に代入しています。
ここでSampleクラスのDeconstructメソッドが呼ばれます。
Deconstructメソッドの戻り値はvoid固定で、out引数で分解される値を返します。

いらない項目がある場合はアンダーバー「_」を使って破棄することができます。

var (value1, _, value3) = cls;

また、Deconstructメソッドは複数定義することができ、受け取る側の変数の数や型によって呼ばれるDeconstructが変わります。

using System;

class Sample
{ 
    public int Property1 { get; set; }
    public int Property2 { get; set; }
    public string Property3 { get; set; }

    // Deconstructメソッドの実装
    public void Deconstruct(out int prop1, out int prop2)
    {
        prop1 = this.Property1;
        prop2 = this.Property2;
    }
    public void Deconstruct(out int prop1, out int prop2, out string prop3)
    {
        prop1 = this.Property1;
        prop2 = this.Property2;
        prop3 = this.Property3;
    }
}

class Program
{
    public static void Main()
    {
        // クラスのインスタンスを作成
        var cls = new Sample { Property1 = 10, Property2 = 20, Property3 = "abc" };

        // クラスを分解して複数の値を取り出す
        var (v1, v2) = cls;
        var (value1, value2, value3) = cls;
    }
}

C# プログラミング講座に戻る

コメント

タイトルとURLをコピーしました