這篇筆記要介紹的是 C# 7 新增的 Tuple 語法....
C# 函式如果要有多個回傳值,大抵離不開以下幾種作法:
如果只是比較簡單、或者用完即丟的場合,就沒必要寫一個新類別,而可以選擇 .NET framework 提供的 Tuple。底下示範 C# 7 之前的 Tuple 用法:
你可以看到,函式
使用
底下是上述範例的 C# 7 版本:
你可以看到,跟先前的版本比起來,有三個地方不一樣:
以上範例的 .NET Fiddle 連結:https://dotnetfiddle.net/9Hv9PZ
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
物件時,是以 Item1
、Item2
…ItemN
的方式來取得其內部的物件。從這裡可以明顯看得出來,無法用名稱、而只能用順序編號的方式來存取其內部元素,這種寫法很難稱得上高可讀性。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 加入這個組件參考:
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
。
沒有留言: