.NET 6新特性試用 | 模式匹配之Extended Property Patterns
阿新 • • 發佈:2021-12-21
模式匹配是一種測試表達式以確定其是否具有某些特徵的技術。
例如, 下面的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這種簡化的語法,可以使模式匹配表示式更易於閱讀,特別是對於巢狀較深的型別。