C# 9.0 新特性之模式匹配簡(jiǎn)化的實(shí)現(xiàn)
記得在 MS Build 2020 大會(huì)上,C# 語言開發(fā)項(xiàng)目經(jīng)理 Mads Torgersen 宣稱 C# 9.0 將會(huì)隨著 .NET 5 在今年 11 月份正式發(fā)布。目前 .NET 5 已經(jīng)到了 Preview 5 階段了,C# 9.0 也已經(jīng)初具規(guī)模。忍不住激動(dòng)的心情,暫停更新《C#.NET 拾遺補(bǔ)漏》系列幾天,先要和大家分享一下我了解到的 C# 9.0 的新特性。由于新特性比較多,所以會(huì)分成幾篇來講。這是第一篇,專講模式匹配這個(gè)特性的簡(jiǎn)化。
模式匹配(Pattern Matching)是在 C# 7.0 引入的,是對(duì) switch 語句的增強(qiáng),可以支持實(shí)現(xiàn)復(fù)雜的條件匹配。下面我先用一個(gè)示例來展示一下模式匹配的一般的用法。
假如現(xiàn)在我們要計(jì)算各種車輛在某高速的通行費(fèi),比如有下面四種車輛,分別定義為以下四個(gè)類,各個(gè)類中定義了和通行費(fèi)計(jì)算相關(guān)的屬性:
public class Car { public int Passengers { get; set; } } public class DeliveryTruck { public int GrossWeightClass { get; set; } } public class Taxi { public int Fares { get; set; } } public class Bus { public int Capacity { get; set; } public int Riders { get; set; } }
下面用用模式匹配的方式來實(shí)現(xiàn)一個(gè)計(jì)算通行費(fèi)的方法:
public decimal CalculateToll(object vehicle) => vehicle switch { Car { Passengers: 0} => 2.00m + 0.50m, Car { Passengers: 1} => 2.0m, Car { Passengers: 2} => 2.0m - 0.50m, Car c => 2.00m - 1.0m, Taxi t => t.Fares switch { 0 => 3.50m + 1.00m, 1 => 3.50m, 2 => 3.50m - 0.50m, _ => 3.50m - 1.00m }, Bus b when ((double)b.Riders / (double)b.Capacity) < 0.50 => 5.00m + 2.00m, Bus b when ((double)b.Riders / (double)b.Capacity) > 0.90 => 5.00m - 1.00m, Bus b => 5.00m, DeliveryTruck t when (t.GrossWeightClass > 5000) => 10.00m + 5.00m, DeliveryTruck t when (t.GrossWeightClass < 3000) => 10.00m - 2.00m, DeliveryTruck _ => 10.00m, { } => throw new ArgumentException(message: "Not a known vehicle type", paramName: nameof(vehicle)), null => throw new ArgumentNullException(nameof(vehicle)) };
代碼來源于文末參考鏈接
如果上面代碼閱讀起來感覺吃力,你可以先閱讀文末參考鏈接中的第一個(gè)鏈接,關(guān)于模式匹配的詳細(xì)介紹。
實(shí)現(xiàn)這個(gè)業(yè)務(wù)邏輯,若在 C# 7.0 之前,需要用一堆的 if/else 來實(shí)現(xiàn)。有了模式匹配后,變得方便了很多,而且使用上很靈活,代碼結(jié)構(gòu)也更優(yōu)美。
對(duì)我來說,模式匹配是個(gè)極好的特性!但這還不夠,C# 9.0 對(duì)模式匹配的寫法做了進(jìn)一步的簡(jiǎn)化!
以上面代碼為例,模式匹配可以分為三種:簡(jiǎn)單模式、關(guān)系模式和邏輯模式。下面分別說說 C# 9.0 對(duì)三種模式的簡(jiǎn)化。
簡(jiǎn)單模式
以上面 CalculateToll 方法示例代碼為例,簡(jiǎn)單模式是這種:
vehicle switch { ... Car c => 2.00m - 1.0m }
我們其實(shí)可以發(fā)現(xiàn),上面的變量 c 聲明了卻沒用被使用,現(xiàn)在 C# 9.0 中可以把它省略了:
vehicle switch { ... Car => 2.00m - 1.0m }
關(guān)系模式
以上面 CalculateToll 方法示例代碼為例,關(guān)系模式是通過比較(大小)關(guān)系來匹配的,對(duì)應(yīng)的代碼片段如下:
DeliveryTruck t when (t.GrossWeightClass > 5000) => 10.00m + 5.00m, DeliveryTruck t when (t.GrossWeightClass < 3000) => 10.00m - 2.00m, DeliveryTruck _ => 10.00m,
現(xiàn)在 C# 9.0 可以簡(jiǎn)寫成:
DeliveryTruck t when t.GrossWeightClass switch { > 5000 => 10.00m + 5.00m, < 3000 => 10.00m - 2.00m, _ => 10.00m, }
邏輯模式
在 C# 9.0 中,你可以通過邏輯操作符 and、or 和 not 對(duì)模式進(jìn)行組合,下面是一些示例:
DeliveryTruck t when t.GrossWeightClass switch { < 3000 => 10.00m - 2.00m, >= 3000 and <= 5000 => 10.00m, > 5000 => 10.00m + 5.00m, } not null => throw new ArgumentException($"Not a known vehicle type: {vehicle}", nameof(vehicle)), null => throw new ArgumentNullException(nameof(vehicle))
另外,not 關(guān)鍵字還可以用來替代 if 條件判斷中的邏輯非(!),比如:
// 原來的寫法 if (!(e is Customer)) { ... } // 新的寫法(易讀性更好) if (e is not Customer) { ... }
C# 9.0 還有很多其它好用的新特性,下一篇文章繼續(xù)與你分享。文章寫短一點(diǎn)不是因?yàn)槲彝祽泄?,而是為了促使大家一次性看完,方便大家在零碎時(shí)間閱讀,避免因文章太長(zhǎng)而成為“收藏不看”系列。
參考:
https://bit.ly/2MNc0DJ
https://bit.ly/2UzEIwu
到此這篇關(guān)于C# 9.0 新特性之模式匹配簡(jiǎn)化的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# 9.0 模式匹配 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
作者:王亮
出處:http://cnblogs.com/willick
聯(lián)系:liam.wang@live.com
相關(guān)文章
C# 文件上傳下載(Excel導(dǎo)入,多線程下載)功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了C# 文件上傳下載(Excel導(dǎo)入,多線程下載)功能的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-08-08WinForm實(shí)現(xiàn)鼠標(biāo)拖動(dòng)控件跟隨效果
這篇文章主要為大家詳細(xì)介紹了WinForm實(shí)現(xiàn)鼠標(biāo)拖動(dòng)控件跟隨效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03C#程序中session值的保存方法以及轉(zhuǎn)為字符串的方法總結(jié)
這篇文章主要介紹了C#程序中session值的保存方法以及轉(zhuǎn)為字符串的方法總結(jié),經(jīng)常被用于ASP.NET網(wǎng)絡(luò)編程項(xiàng)目中,需要的朋友可以參考下2016-04-04動(dòng)態(tài)改變gridview列寬度函數(shù)分享
通常用GridView綁定datatable,由于需要?jiǎng)討B(tài)綁定到不同的datatable所以需要?jiǎng)討B(tài)調(diào)整GridView的寬度。寫了這個(gè)函數(shù)實(shí)現(xiàn)該功能2014-01-01selenium.chrome寫擴(kuò)展攔截或轉(zhuǎn)發(fā)請(qǐng)求功能
Selenium?WebDriver?是一組開源?API,用于自動(dòng)測(cè)試?Web?應(yīng)用程序,利用它可以通過代碼來控制chrome瀏覽器,今天通過本文給大家介紹selenium?chrome寫擴(kuò)展攔截或轉(zhuǎn)發(fā)請(qǐng)求功能,感興趣的朋友一起看看吧2022-07-07C# 大數(shù)據(jù)導(dǎo)出word的假死報(bào)錯(cuò)的處理方法
C# 大數(shù)據(jù)導(dǎo)出word的假死報(bào)錯(cuò)的處理方法,需要的朋友可以參考一下2013-03-03C#連接Oracle數(shù)據(jù)庫使用Oracle.ManagedDataAccess.dll
這篇文章主要介紹了C#使用Oracle.ManagedDataAccess.dll的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11