1. 程式人生 > 程式設計 >C#8 的模式匹配實現

C#8 的模式匹配實現

C# 7 裡面的Pattern Mathing

更多內容請檢視官方文件:https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-8#more-patterns-in-more-places?WT.mc_id=DT-MVP-5003302

is 模式

switch 和 when

C# 8 裡面的Pattern Matching

使用Deconstructor 和 位置匹配模式

下面兩個類Teacher和Student都由建構函式(Constructor)和Deconstructor:

下面我想寫一個方法判斷學生是不是5年級並且是學數學的:

這裡我們就用到了Student的Deconstructor和位置匹配模式,這裡面的下劃線叫做“discard”(丟棄),表示我們不會使用它不關心它。

如果程式碼這樣寫,那麼傳進來的任何學生都滿足這個匹配。

如果想判斷5年紀的學生,我們可以這樣寫:

還想判斷他的老師是否教數學,可以這樣寫:

注意,這裡面呼叫的都是Deconstructor。

實際上,我們可以把Deconstructor的型別去掉,像這樣:

實際上針對這種需求,使用if語句可能更好,更容易維護。但是如果迴圈巢狀的情況下無法使用if,那麼這種位置模式匹配就有用了。

屬性匹配模式

位置匹配模式很強大,但是可閱讀性太差,下面看看屬性匹配模式。

還是之前的需求:

我想這個一看就明白,不需要解釋了吧?

而且這個方法可以寫的更通用一些:

引數型別改為object,然後先判斷它是不是Student,在判斷是否是5年級學數學的。

Swtich 表示式

有三個形狀的類,它們的屬性各不相同:

下面我要寫一個方法,根據不同的形狀,顯式相應的資訊。這裡我會使用C# 8 的 switch表示式。

先從最簡單的只有一種情況開始:

方法引數的型別是object,然後使用C# 8的switch表示式,該表示式有返回值,所以可以把返回值放到變數裡面然後返回。

可以看到,switch表示式裡面沒有case 關鍵字,這裡使用的是lambda表示式。

這句話的意思就是,如果shape是Rectangle型別的,那麼我們可以通過r這個變數來訪問它,右側的字串就是這個case表示式的值,這裡的返回值就是一個字串。

把三個形狀都寫上,就是這樣:

注意,這裡沒有break或者return。並且switch表示式不支援“接盤”(fall through)。

那麼預設情況怎麼新增呢?這裡我們使用discard匹配模式:

這裡我們還可以使用屬性匹配模式來設定過濾條件:


使用巢狀的switch表示式,也可以達到同樣的目的:

最後我們可以讓整個方法更簡化一點,使用expression-bodied方法:


但還是不要過度使用這種巢狀的模式,畢竟人類還需要閱讀你的程式碼。。。

元組匹配模式

先定義一個列舉:


然後寫一個方法,傳進兩個顏色,得到混合後的顏色:

這裡面用的就是元組匹配模式。

最下面還判斷了兩種顏色都一樣的情況,以及其它所有情況。

更詳細內容請檢視官方文件:https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-8#more-patterns-in-more-places?WT.mc_id=DT-MVP-5003302

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。