本文へスキップ
BecomeCoder

C#文法コース · 第9章 文法をさらに使いこなす · レッスン62

分割代入(Deconstruct)

ブラウザで完結

導入

関数から2つの値を返して、それぞれ別の変数で受け取りたい」。タプルと分割代入を使うと、(名前, 年齢) = ... の形で一気に受け取れます。自作の型にも Deconstruct を用意すれば同じことができます。

図解

flowchart LR
    T["("Taro", 20)"] --> A["var (name, age)"]
    A --> N["name = "Taro""]
    A --> G["age = 20"]
    style A fill:#e1f5fe

サンプル

// タプルを一気に分解して受け取る
var (name, age) = GetUser();
Console.WriteLine($"{name} {age}");   // Taro 20

(string, int) GetUser() => ("Taro", 20);

// 自作型は Deconstruct メソッドを用意すれば分解できる
var (x, y) = new Point(3, 4);
Console.WriteLine($"{x},{y}");        // 3,4

class Point
{
    public int X { get; }
    public int Y { get; }
    public Point(int x, int y) { X = x; Y = y; }
    public void Deconstruct(out int x, out int y) { x = X; y = Y; }
}
  • var (a, b) = tuple; でタプルを複数変数へ一括代入できる
  • 自作型に void Deconstruct(out ...) を書くと、その型も分解できる(record は自動で用意される)
  • いらない要素は _(破棄)で受け取れる

やってみよう

GetUser の戻り値を増やして3要素にし、var (a, b, c) = ... で受け取ってみましょう。1つだけ不要なら _ で捨てられます。

演習

(int width, int height) size = (3, 4);

// TODO: size を w と h に分割代入し、面積 w * h を出力してください
var (w, h) = ___;
Console.WriteLine(w * h);   // 12
  • 期待される出力: 12
ヒント1を見る

var (w, h) = size; と書けばタプルが分解されます

ヒント2を見る

wh にそれぞれ 3 と 4 が入るので、w * h は 12

まとめ

  • 分割代入は「複数の値を一度に受け取る」書き方
  • タプルはそのまま、自作型は Deconstruct で分解できる
  • 不要な要素は _ で破棄できる

次回: 短く条件分岐する「三項演算子(条件演算子)」です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。