在 .NET 4.0 以前,方法需要回傳多個值時,通常只有兩種不夠優雅的選擇:使用 out 參數(語法囉嗦、呼叫端易誤用),或另建 DTO 類別(增加檔案、過度設計)。System.Tuple 的出現,提供了輕量、型別安全、即時可用的多值回傳方案。
private void TestTuple()
{
var result = Test1(); // 型別推斷為 Tuple<int, int, string>
if (result.Item3 == "Test1")
{
// 業務邏輯...
}
}
private Tuple<int, int, string> Test1()
{
return Tuple.Create(1, 3, "Test1");
}
ItemN 唯讀,執行緒安全。Tuple<T1...T7, TRest> 第 8 位可再嵌套 Tuple。Tuple.Create: 利用型別推斷簡化宣告,無需重複寫泛型參數。var (id, count, name) = Test1(); // 需 C# 7 / VS 2017+
Console.WriteLine($"{id}, {count}, {name}");
var topUsers = users
.GroupBy(u => u.Department)
.Select(g => Tuple.Create(g.Key, g.Count(), g.Max(u => u.Salary)))
.OrderByDescending(t => t.Item2)
.Take(5);
ValueTuple (C# 7 / .NET 4.7+)// ValueTuple 可命名元素,可變更,效能更好
(int Id, int Count, string Name) GetUserStat() => (1, 3, "Test1");
var (Id, Count, Name) = GetUserStat();
| 適用 | 不適用 |
|---|---|
| 私有/內部方法快速回傳 2~4 個相關值 | 公開 API、跨組件介面(建議用 Record 或 DTO) |
| LINQ 中臨時分組統計 | 需序列化傳輸(Tuple 非標準 JSON 結構) |
| 避免為一次性邏輯建立類別 | 元素超過 4 個且語意複雜(改用 class/record) |
Tuple 是 .NET 基礎類別庫中「小而美」的工具,善用它能減少樣板碼,讓意圖更清晰。若專案已升級至 .NET 4.7+ / C# 7,優先考慮 ValueTuple 獲得更好效能與可讀性。