分解
タプルを個別の変数に展開します。
「分解」は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フィードバックを取得できます。ローカル設定は不要です。