因為隔壁介紹原則的部分有點卡住了,所以這週來紀錄一下挺常用到的方便東西:Tuple

這篇的 Tuple 指的是 C# 7.0 後提供的 ValueTuple 和相關語法,舊版得用 Tuple.Create 建立,成員的名稱也只能使用 Item1, Item2…,實用性並不是很高。但新 Tuple 出現後,方便程度大大提升,這邊就稍作紀錄一下。

註:此處使用的 Dump 是 Linqpad 提供的輸出方法,把它當成 Print 就行了。

var student = (1, "王小明");
student.Item1.Dump(); // 1
student.Item2.Dump(); // 王小明

student.Dump();

可以看到 Tuple 的建立相當簡單,只需要用小括號 () 括選起來即可。建立後的內容就會像這樣:

但這樣使用就和之前一樣,取出來時只能拿 Item1, Item2,放個幾天根本就不記得 Item1 裡面是啥東西了。這時我們就可以替成員們取名字

(int ID, string Name) student = (1, "王小明");
student.ID.Dump(); // 1
student.Name.Dump(); // 王小明

如此使用的時候就和一般操作物件的習慣沒有差別,也增加了可讀性。

到這裡可能感覺只是個方便的變數打包小工具,但其真正順手的地方就在於作為回傳值的時候。

過去要一次回傳多個值,除了使用 Ref 等方式以外,就只能乖乖做一個類別來裝,但有時候傳的東西又相當簡單,實在不太願意就此建立一個類別,又或是事情已經無法挽回,專案虛胖了一堆米蟲類別。有了 Tuple 之後,面對這種情況就可以直接使用 Tuple 解決,並且替成員們命名之後,既簡便又好讀!

// 回傳型別使用 Tuple
public (bool IsSuccess, string Message) DoSomeThing()
{
    // 做了一堆事情
	return (true, "操作成功");
}

void Main()
{
	var result = DoSomeThing();
	result.IsSuccess.Dump(); // true
	result.Message.Dump(); // 操作成功
}

而當我們作為回傳值使用時,也可以直接原地解封:

// 回傳型別使用 Tuple
public (bool IsSuccess, string Message) DoSomeThing()
{
    // 做了一堆事情
	return (true, "操作成功");
}

void Main()
{
    // 直接拆開賦值給多個變數
	var (isSuccess, message) = DoSomeThing();
	isSuccess.Dump(); // true
	message.Dump(); // 操作成功
}

作為一個簡易臨時型別挺方便的,但要注意不要用過頭了。兩三個成員還算方便,如果有七八個甚至十來個成員,請還是乖乖做成類別吧!

參考資料