這篇筆記要介紹的是 C# 7 新增的 Tuple 語法....

C# 函式如果要有多個回傳值,大抵離不開以下幾種作法:
  • 使用輸出參數。
    亦即透過參數列的 out 修飾詞來定義輸出參數。
  • 傳回一個 dynamic 物件。
    此作法的缺點是效能較差,而且沒有編譯時期的型別安全檢查。
  • 使用自訂型別。
    亦即寫一個新類別,把要返回的多項資訊包在這個類別裡面,然後讓函式返回這個自訂類別的物件。
  • 使用 .NET 現成的 System.Tuple

如果只是比較簡單、或者用完即丟的場合,就沒必要寫一個新類別,而可以選擇 .NET framework 提供的 Tuple。底下示範 C# 7 之前的 Tuple 用法:

public Tuple<string, int> GetEmpInfo()  // 指定回傳型別
{
// 建立回傳的 Tuple 物件
return Tuple.Create("王大同", 50);
}

public void ShowEmpInfo()
{
var emp = GetEmpInfo();
// 使用 Tuple 物件的內容
Console.WriteLine($"{emp.Item1} {emp.Item2}"); // "王大同 50"
}

你可以看到,函式 GetEmpInfo 返回的是泛型 Tuple<T1, T2>,並且使用 Tuple.Create() 方法來建立返回的 Tuple 物件。.NET framework 為 Tuple 定義了八個版本的泛型方法,讓你可以輕鬆建立包含多達八個、甚至更多個數值的物件。

使用 Tuple 物件時,是以 Item1Item2ItemN 的方式來取得其內部的物件。從這裡可以明顯看得出來,無法用名稱、而只能用順序編號的方式來存取其內部元素,這種寫法很難稱得上高可讀性。C# 7 在這方面做了改進。

底下是上述範例的 C# 7 版本:


你可以看到,跟先前的版本比起來,有三個地方不一樣:
  • 在宣告函式的回傳型別時(第 2 行),語法已經能夠像參數列那樣指定參數的名稱。這裡使用的是 C#7 新增的 tuple type 語法。
  • 建立 Tuple 物件的寫法更簡單了(第 6 行)。這裡不是用 new 來建立物件,而是 C# 7 的 tuple literal 語法。
  • 使用 Tuple 物件時,可以用名稱來存取內部元素(倒數第 2 行)。

以上範例的 .NET Fiddle 連結:https://dotnetfiddle.net/9Hv9PZ

註:如果你的 Visual Studio 在編譯此範例程式時出現錯誤:

Cannot define a class or member that utilizes tuples because the compiler required type ‘System.Runtime.CompilerServices.TupleElementNamesAttribute’ cannot be found. Are you missing a reference? 

請用 NuGet 加入這個組件參考:System.ValueTuple