C# のデコンストラクト

C# のデコンストラクトとは?

C# のデコンストラクトというのは、分割代入を行うための仕組みです。

オブジェクトから、そのオブジェクトのプロパティの値をそれぞれ異なる変数に代入する仕組みを分割代入といいます。タプルの分割代入については「タプルの分割代入」をご覧ください。

Deconstruct() という名前のメソッドを定義することで、分割代入ができるようになります。

デコンストラクトを行う Deconstruct() メソッドの実装

Deconstruct() メソッドは、メソッドの out 変数でメソッド内から呼び出し元に値を返すことで、分割代入を実現します。

下のコードでは9行目から17行目で Deconstruct() を定義しており、31 行目で empオブジェクトからの分割代入を行っています。

using System;

class Employee
{
  public string Name { get; set; }
  public int Age { get; set; }
  public string Title { get; set; }

  public void Deconstruct(
    out string name,
    out int age,
    out string title)
  {
    name = Name;
    age = Age;
    title = Title;
  }
}

class TestApp
{
  public static void Main(string[] args)
  {
    var emp1 = new Employee
    {
      Name = "Hanako",
      Age = 24,
      Title = "HR"
    };

    var (n1, a1, t1) = emp1;
    Console.WriteLine($"{n1} ({a1}) {t1}");
    // Hanako (24) HR
  }
}

デコンストラクトで全ての変数が必要ではない場合

全ての変数が必要ではない場合は、呼び出し側で受け取る必要のない変数の箇所をアンダースコア _ を記述して省略することができます。

上の例で、例えば age を受け取る必要がない場合には、次のようにします。

    var (n1, _, t1) = emp1;
    Console.WriteLine($"{n1} {t1}");

Deconstruct() メソッドのオーバーロード

Deconstruct() メソッドをオーバーロードすることもできます。

次の例では二つの変数の分割代入を行う Deconstruct() メソッドと、三つの変数の分割代入を行う Deconstruct() メソッドを作成しています。

using System;

class Employee
{
  public string Name { get; set; }
  public int Age { get; set; }
  public string Title { get; set; }

  public void Deconstruct(
    out string name,
    out string title)
  {
    name = Name;
    title = Title;
  }

  public void Deconstruct(
    out string name,
    out int age,
    out string title)
  {
    name = Name;
    age = Age;
    title = Title;
  }
}

class TestApp
{
  public static void Main(string[] args)
  {
    var emp1 = new Employee
    {
      Name = "Hanako",
      Age = 24,
      Title = "HR"
    };

    var (n1, a1, t1) = emp1;
    Console.WriteLine($"{n1} ({a1}) {t1}");
    // Hanako (24) HR

    var (n2, t2) = emp1;
    Console.WriteLine($"{n2} {t2}");
    // Hanako HR
  }
}

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 C# 入門