C# 入門

ホーム > C# の基礎 > オブジェクトからタプルを生成するデコンストラクト

オブジェクトからタプルを生成するデコンストラクト

C# 7.0 からはデコンストラクト (deconstruct) が使えるようになりました。逆に言うとデコンストラトを使うときには、 C#7.0 以降が使える環境である必要がありますので、使うときには注意しましょう。

C# 7.0 の言語仕様はこの記事を書いている時点 (2017年6月現在) でまだ確定しておらず、言語仕様書は確認できていません。

MSDN にも記載がないので、呼び方は今後変わるかもしれません。ご了承ください。

Visual Studio 2017 の C# コンパイラで動作確認しています。

さて、デコンストラクトとは何でしょうか。

デコンストラクトを説明するために、まずコンストラクトを考えます。 コンストラクタというのは、C# でもそうですが一般的に、 オブジェクトを生成する時のメソッドのことです。

コンストラクタに値を与えて、オブジェクトを生成するわけです。

一方、新しく導入されたデコンストラクタは、オブジェクトからタプルを作成するためのメソッドです。

デコンストラクションをするためのメソッド は、Deconstruct という名前にします。

次の例では、ここで定義した Employee クラスでデコンストラクタを定義しています。これによって、 オブジェクトからタプルに値をセットできます。

using System;

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

    //C# 7
    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 (n, a, t) = emp1;

        Console.WriteLine($"{n} ({a}) {t}");
    }

}

また、アンダースコア (_) を使うと、タプルの生成時に不要な変数を宣言する必要がなくなります。

        var (n, a, _) = emp1;

尚、コンパイルする時には ValueTuple.dll への参照が必要でした。

> csc /r:ValueTuple.dll foo.cs

コンパイルに失敗する時は、コンパイラのバージョンをチェックするとか、言語バージョンオプション (langversion) で 7 を明示するなどするとよいと思います。

ホーム > C# の基礎 > オブジェクトからタプルを生成するデコンストラクト