【C#】タプル(Tuple)とは?複数の戻り値をまとめて返すスマートな方法
🧩 タプル(Tuple)とは?
**タプル(Tuple)**とは、複数の異なる値を1つのまとまりとして扱うことができるデータ構造です。
C# 7.0以降で正式に導入され、複数の戻り値を返す場面や、一時的なデータのグループ化にとても便利です。
🔰 基本構文と使い方
(string, int) person = ("Eigo", 38);
Console.WriteLine(person.Item1); // Eigo
Console.WriteLine(person.Item2); // 38
- これは「名前が string、年齢が int」の2要素を持つタプル。
-
Item1
,Item2
で要素にアクセスできます。
✅ 名前付きタプル(可読性UP)
(string Name, int Age) person = ("Eigo", 38);
Console.WriteLine(person.Name); // Eigo
Console.WriteLine(person.Age); // 38
- プロパティに名前をつけることでコードの可読性が格段に上がります。
- 名前付きタプルは C# 7.1 以降で推奨されるスタイルです。
🚀 メソッドの戻り値に使う(複数戻り値を返す)
(string Name, int Age) GetPerson()
{
return ("Eigo", 38);
}
var (name, age) = GetPerson();
Console.WriteLine($"{name}, {age}"); // Eigo, 38
- 複数の型の戻り値を一括で返すことができます。
- デコンストラクション構文(
var (a, b)
)で簡単に分解可能。
🎯 よくある使用シーン
シーン | 理由・用途 |
---|---|
複数の値を一時的にまとめたい | DTOを定義するほどでもない場合に便利 |
メソッドの戻り値を2つ以上返したい | タプルで返すことで呼び出しがスッキリ |
テストコードで入力と結果をまとめたい |
response と actual を同時に確認できる |
⚠️ 注意点と使い分け
項目 | タプル(Tuple) | クラス / レコード型 |
---|---|---|
可読性 | 中程度(名前付きで改善可能) | 高い(プロパティ名が明確) |
拡張性 | △ 値の追加がやや不便 | ◎ 拡張しやすい |
一時的な用途向け | ◎ | △ クラス定義がやや冗長 |
意味を持たせたい | △ 名前次第 | ◎ 型名・プロパティ名で明確化 |
❌ NGパターン:object/dynamic の利用
以下のような書き方は型安全性が失われるため非推奨です。
object GetData() => true ? "abc" : 123;
- 型チェックが甘くなり、実行時エラーの元になります。
- タプルを使うことで、型を明示しつつ複数値を返すことができます。
📝 まとめ
- **タプルは軽量な「一時的なデータのまとまり」**として非常に便利
- 複数の戻り値を返したい場面ではタプルでコードを簡潔に
- 意味を強調したい or 拡張性が必要な場合はレコードやDTOで定義
🔗 関連タグ
#CSharp
#Tuple
#戻り値
#可読性
#メソッド設計
🙋♂️「戻り値の設計どうする?」と悩んだときに、この記事が少しでも参考になれば嬉しいです!
👍 役に立ったらストック・いいねお願いします!