0Pricing
C# Academy · レッスン

分解

タプルを個別の変数に展開します。

「分解」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

デコンストラクションとは

デコンストラクションは、タプルやオブジェクトを1つの文で個別の変数に分解する機能です。それぞれの要素に直接名前を付けられます。

using System;

class Program
{
    static void Main()
    {
        var point = (3, 4);
        (int x, int y) = point;
        Console.WriteLine("x=" + x + ", y=" + y);
    }
}

タプルをデコンストラクトする

= の左側に、対象の変数をかっこで囲んで記述します。それぞれの変数に、対応するタプルの要素が代入されます。

using System;

class Program
{
    static void Main()
    {
        var user = ("Ada", 36);
        (string name, int age) = user;
        Console.WriteLine(name + " is " + age);
    }
}

デコンストラクションで var を使う

var を使って、コンパイラーに型を推論させることができます。変数ごとに指定することも、グループ全体に指定することも可能です。

using System;

class Program
{
    static void Main()
    {
        var data = (1, "one", true);
        var (id, word, flag) = data;
        Console.WriteLine(id + " " + word + " " + flag);
    }
}

メソッドの結果をデコンストラクトする

メソッドが返すタプルを、名前付きの変数へ直接デコンストラクトできます。

using System;

class Program
{
    static (int, int) MinMax(int a, int b) => a < b ? (a, b) : (b, a);

    static void Main()
    {
        var (lo, hi) = MinMax(8, 3);
        Console.WriteLine("min=" + lo + ", max=" + hi);
    }
}

値を破棄する

デコンストラクション中に不要な部分を無視するには、アンダースコア _ を使用します。

using System;

class Program
{
    static (int, int, int) Rgb() => (255, 128, 0);

    static void Main()
    {
        var (r, _, _) = Rgb();
        Console.WriteLine("Red channel: " + r);
    }
}

既存の変数へデコンストラクトする

型名を省略すれば、すでに宣言されている変数へ代入できます。

using System;

class Program
{
    static void Main()
    {
        int a = 0, b = 0;
        (a, b) = (10, 20);
        Console.WriteLine(a + ", " + b);
    }
}

タプルで値を入れ替える

便利なテクニックとして、タプルのデコンストラクションを使えば、一時変数を用意せずに1行で2つの変数の値を入れ替えられます。

using System;

class Program
{
    static void Main()
    {
        int x = 1, y = 2;
        (x, y) = (y, x);
        Console.WriteLine("x=" + x + ", y=" + y);
    }
}

Deconstruct メソッド

独自のクラスでも、out パラメーターを持つ Deconstruct メソッドを定義することで、デコンストラクションをサポートできます。

using System;

class Point
{
    public int X, Y;
    public Point(int x, int y) { X = x; Y = y; }

    public void Deconstruct(out int x, out int y)
    {
        x = X;
        y = Y;
    }
}

class Program
{
    static void Main()
    {
        var p = new Point(5, 9);
        var (px, py) = p;
        Console.WriteLine(px + ", " + py);
    }
}

複数の Deconstruct オーバーロード

クラスには、異なる数の値を公開する複数の Deconstruct オーバーロードを用意できます。

using System;

class Person
{
    public string Name; public int Age; public string City;
    public Person(string n, int a, string c) { Name = n; Age = a; City = c; }

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

class Program
{
    static void Main()
    {
        var p = new Person("Ada", 36, "London");
        var (name, age) = p;
        Console.WriteLine(name + ", " + age);
    }
}

foreach でデコンストラクションする

タプルのコレクションをループ処理するときは、foreach ヘッダー内で各要素を直接デコンストラクトできます。

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pairs = new List<(string, int)>
        {
            ("Ann", 30),
            ("Bob", 25)
        };
        foreach (var (name, age) in pairs)
            Console.WriteLine(name + " is " + age);
    }
}

まとめ

デコンストラクションを使うと、複数の値を返したり保持したりするコードが読みやすくなり、使用する箇所で各要素に名前を付けられます。

using System;

class Program
{
    static (int Quotient, int Remainder) Divide(int a, int b) => (a / b, a % b);

    static void Main()
    {
        var (q, r) = Divide(17, 5);
        Console.WriteLine("17 / 5 = " + q + " remainder " + r);
    }
}

理解度チェック

デコンストラクションについて理解できているか確認しましょう。

まとめ

デコンストラクションは、タプルやオブジェクトを1つの文で名前付き変数に分解する機能です。var (a, b) = ... のように記述し、_ で不要な要素を破棄できます。変数の入れ替えや foreach でのデコンストラクションも可能です。独自のクラスでは、out パラメーターを使う Deconstruct メソッドを定義して対応し、必要に応じてオーバーロードも用意できます。

using System;

class Program
{
    static void Main()
    {
        var (a, b, c) = (1, 2, 3);
        Console.WriteLine(a + b + c);
    }
}

よくある質問

「分解」レッスンは無料ですか?

はい。「分解」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「分解」で何を学びますか?

タプルを個別の変数に展開します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「分解」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 値タプルの基本
  2. 名前付きタプル要素
  3. 分解
  4. メソッドの戻り値としてのタプル
← C# Academyに戻る