1. 程式人生 > 其它 >.NET 6新特性試用 | 模式匹配之Extended Property Patterns

.NET 6新特性試用 | 模式匹配之Extended Property Patterns

模式匹配是一種測試表達式以確定其是否具有某些特徵的技術。

例如, 下面的Employee類和Manager類:

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Manager? Manager { get; set; }
}

public class Manager : Employee
{
    public string Position { get; set; }
}

我們可以使用模式匹配,檢查Employee例項變數的實際型別並且匹配其屬性,如下所示:

Employee obj = new Manager { Id=1, Name="zhangsan", Position="CEO" };
if(obj is Manager { Position: "CEO" } ceo)
{
    Console.WriteLine(ceo.Name);
};

Extended Property Patterns

如果要使用模式匹配檢查變數巢狀的屬性,則書寫起來比價複雜,如下所示:

if(obj is Employee { Manager: { Name:"lisi", Manager:{ Position: "CEO" } } } employee)

而在.NET 6中,我們可以使用.引用屬性的巢狀成員,這種方式稱為Extended Property Patterns(擴充套件屬性模式)

將上面的程式碼改寫後如下:

if(obj is Employee { Manager.Name:"lisi", Manager.Manager.Position: "CEO" } employee)

另外,使用擴充套件屬性模式不僅可以引用類定義的巢狀屬性,同時還可以使用巢狀屬性原生型別的屬性,如下所示:

if(obj is Employee { Manager.Name.Length:4 } employee)

結論

需要注意的是,如果變數的Manager屬性為null,或者任何巢狀屬性為null 都不會得到NullReferenceException。因為在這裡編寫模式是為了檢查物件是否匹配,而不是使用程式碼直接訪問該屬性。

這意味著,如果Manager屬性為null,則模式{Manager.Name:"lisi"}不匹配,則上面if語句的條件計算結果為false,僅此而已。

利用Extended Property Patterns這種簡化的語法,可以使模式匹配表示式更易於閱讀,特別是對於巢狀較深的型別。