導入
「関数から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を見る
w と h にそれぞれ 3 と 4 が入るので、w * h は 12
まとめ
- 分割代入は「複数の値を一度に受け取る」書き方
- タプルはそのまま、自作型は
Deconstructで分解できる - 不要な要素は
_で破棄できる