C# 10:巢狀屬性樣式

 本文要介紹的是 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) 
            {
                // 至此全部的比對條件成立
            }
        }
    }
}
最後把前面幾個範例整理成一張圖,方便快速複習:


Happy coding!

沒有留言:

技術提供:Blogger.
回頂端⬆️