本文要介紹的是 C# 10 新增的巢狀屬性語法。
在樣式比對的部分,C# 10 針對巢狀屬性的寫法有了進一步簡化。先來看一個沒有使用樣式比對的例子:
var obj = new Uri("https://www.huanlintalk.com");
if (obj?.Scheme?.Length == 5 && obj?.Segments?.Length > 0)
{
...
}
在 C# 10 之前,如果要改用樣式比對語法,會這樣寫:
if (obj is Uri { Scheme: { Length: 5 }, Segments: { Length: > 0 } })
結果比原本沒有樣式比對的寫法還要囉嗦!還好 C# 10 針對巢狀屬性的語法做了簡化,可以寫成:
if (obj is Uri { Scheme.Length: 5, Segments.Length: > 0 })
事實上,還可以再簡化一點點,把型別省略:
if (obj is { Scheme.Length: 5, Segments.Length: > 0 })
這樣就真的比較簡潔了。剛才的最後兩個使用巢狀屬性的寫法,編譯器會幫我們轉譯成類似底下的程式碼,可以看到所有必要的 null 檢查都幫我們處理了:
if (obj != null)
{
string scheme = obj.scheme;
if (scheme != null && scheme.Length == 5)
{
string[] segments = obj.Segments;
if (segments != null)
{
if (segments.Length > 0)
{
// 至此全部的比對條件成立
}
}
}
}
最後把前面幾個範例整理成一張圖,方便快速複習:
沒有留言: