はじめに
(数値、数値)や(数値とbool)のように2つ以上の値の入れ物が欲しい時、タプルを使うことができます。C#7.0の機能であり、System.ValueTupleと名付けられた構造体に依存しています。.Net Framework 4.6では、System.ValueTupleは含まれておらず、同じ名前のNugetパッケージから利用できます。.Net Framework 4.7では、完全に組み込まれ、miscorlib.dllに含まれています。
非常に紛らわしいのですが、.Net Framework 4.0で、System.Tupleと名付けられたクラスが導入されており、同様にタプルとしての機能を提供します。タプルの利用されるシチュエーションを鑑みて、構造体の方がパフォーマンス上の利点があったため、System.ValueTuple構造体として改めて実装されたようです。以降の説明では、System.Tupleクラスは一切関係ないです。
使い方
宣言・初期化
丸括弧の中に値をカンマ区切りで指定すれば、タプルを表すことができます。試しにint型とstring型のタプルを作ってみます。
1 |
(int, string) foo = (1, "りつか"); |
これは、以下のValueTupleの宣言・初期化と同じ意味です。
1 |
ValueTuple<int, string> foo = new ValueTuple<int, string>(1, "りつか"); |
要素へのアクセス
各要素は、順番にItem1,Item2…でアクセスできます。
1 2 3 4 |
var foo = (1, "りつか"); Console.WriteLine($"{foo.Item1} {foo.Item2}"); // 1 りつか |
ラベル名の付与
Item1やItem2だと分かりにくい場合は、ラベル名を指定する事ができます。
1 2 3 4 |
var foo = (id : 1, name : "りつか"); Console.WriteLine($"{foo.id} {foo.name}"); // 1 りつか |
または
1 2 3 4 |
(int id, string name) foo = (1, "りつか"); Console.WriteLine($"{foo.id} {foo.name}"); // 1 りつか |
ラベル名の付与は、コードの可読性を目的としたものであり、実行時にはItem1、Item2など本来のフィールド名に置き換わっています。
分解
タプルの値を、変数に展開できます。
1 2 3 4 5 |
var foo = (1, "りつか"); (int id, string name) = foo; Console.WriteLine($"{id} {name}"); // 1 りつか |
タプルの値の中で、使用しない物がある場合は_(アンダーバー)を付けると、意図が分かりやすくなります。
1 2 3 4 5 |
var foo = (1, "りつか"); (int _, string name) = foo; Console.WriteLine($"{name}"); //りつか |