国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#8 的模式匹配實現

2020-01-24 00:00:57
字體:
來源:轉載
供稿:網友

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沁阳市| 金乡县| 娱乐| 富裕县| 沁源县| 济源市| 盐津县| 班玛县| 五峰| 扎赉特旗| 玛沁县| 台中县| 会理县| 榆林市| 子长县| 遂平县| 克拉玛依市| 信阳市| 高阳县| 怀集县| 舒兰市| 潞城市| 长葛市| 永寿县| 鸡西市| 宜阳县| 淳化县| 嘉义县| 石阡县| 安仁县| 白水县| 什邡市| 茶陵县| 民县| 辛集市| 琼结县| 曲周县| 基隆市| 顺平县| 顺平县| 杂多县|