在 .NET 4.0 之前,方法需要回傳多個值時,只有兩種不夠優雅的選擇:
out / ref 參數 —— 呼叫端語法噁心、難以串聯、無法用於 Lambda/LINQ。Result、Dto、Model 雜類。.NET 4.0 引入 System.Tuple<T1, T2, ...>(最多 8 個型別參數),提供「匿名多值回傳」的標準化方式。
// 建議使用 Tuple.Create 工廠方法,自動推斷型別
var result = Tuple.Create(1, 3, "Test1"); // Tuple<int, int, string>
// 存取屬性:Item1, Item2, Item3 ...
Console.WriteLine($"Id={result.Item1}, Count={result.Item2}, Name={result.Item3}");
public Tuple TryParseUserInput(string input)
{
if (string.IsNullOrWhiteSpace(input))
return Tuple.Create(false, 0, "輸入為空");
if (int.TryParse(input, out int number))
return Tuple.Create(true, number, "解析成功");
return Tuple.Create(false, 0, "非數字格式");
}
// 呼叫端
var (success, value, msg) = TryParseUserInput("123"); // C# 7+ 解構語法
if (success) Console.WriteLine($"值:{value}");
.NET 4.7 / .NET Core 2.0 引入 System.ValueTuple(結構體,非類別),效能更好、支援命名元素、解構語法:
// 回傳具名元組
public (bool Success, int Value, string Message) TryParseV2(string input)
{
if (int.TryParse(input, out int n))
return (true, n, "OK");
return (false, 0, "Format error");
}
// 使用
var (ok, val, msg) = TryParseV2("456");
Console.WriteLine($"{ok} {val} {msg}");
| 特性 | Tuple (Class) | ValueTuple (Struct) |
|---|---|---|
| 記憶體 | 堆積配置,GC 壓力 | 堆疊配置,零 GC(小型) |
| 可變性 | 不可變 | 可變(欄位可寫入) |
| 命名元素 | 不支援(僅 Item1...) | 支援 (int Id, string Name) |
| 解構語法 | C# 7+ 支援 | 原生支援 |
| 適用版本 | .NET 4.0+ | .NET 4.7+ / .NET Core 2.0+ |
Tuple,搭配 Tuple.Create 簡化宣告。ValueTuple(需引用 System.ValueTuple NuGet 套件於舊版 TFM)。record 或 class,語意更清晰、支援 XML 文件註解、版本演進更安全。Tuple 解決了「方法回傳多值」的長期痛點,配合 C# 7+ 解構語法與 ValueTuple,寫出的程式碼既簡潔又具表達力。記住:內部實作用 Tuple,對外契約用具名型別。