利用SwitchExpression來進行switch流程程式碼判斷的優化

今天突發奇想,想要用SwitchExpression來優化傳統switch語法上的複雜度(其實是程式碼量啦!),經過一番的測試總算想出一些小技巧來使用,將其記錄在此供日後參考。

傳統上的switch使用情境如下,程式碼寫起來比較冗長一點,閱讀上倒是很容易閱讀:

var iIndex = 1;
var cUrl = string.Empty;
switch(iIndex)
{
  case 2:
    cUrl = "BraBra2...";
    break;
  default:
    cUrl = "BraBra1...";
    break;
}
CallUrl(cUrl);

想要用C# 8.0之後的 SwitchExpression 來替代卻發現他根本是為了function / method而設計,不支援一般變數的寫法。於是改個想法,既然是function / method,那不如我就調用Func<TResult> Delegate來實作,也是一種不錯的變通方式。於是程式碼改了一下:

var iIndex = 1;
System.Func<string> cUrl = () => iIndex switch {
  2 => "BraBra2...",
  _ => "BraBra1...",
};
CallUrl(cUrl());

程式碼行數瞬間少了一倍,由12行變成6行,超舒服的。

相關參考

C#8.0 C#9.0 SwitchExpression RecursivePatterns PatternMatching FuncDelegate ActionDelegate