C#8.0中的模式匹配
C# 8.0中的模式匹配相對(duì)C# 7.0來說有了進(jìn)一步的增強(qiáng),對(duì)于如下類:
class Point { public int X { get; } public int Y { get; } public Point(int x, int y) => (X, Y) = (x, y); public void Deconstruct(out int x, out int y) => (x, y) = (X, Y); }
首先來看C# 7.0中一個(gè)經(jīng)典的模式匹配示例:
static?string?Display(object?o) { ????switch?(o) ????{ ????????case?Point?p?when?p.X?==?0?&&?p.Y?==?0: ????????????return?"origin"; ????????case?Point?p: ????????????return?$"({p.X},?{p.Y})"; ????????default: ????????????return?"unknown"; ????} }
在C# 8.0中,它有更加精簡(jiǎn)的寫法。
Switch表達(dá)式
在C# 8.0中,可以利用新的switch方式成模式匹配:
static?string?Display(object?o)?=>?o?switch { ????Point?p?when?p.X?==?0?&&?p.Y?==?0?=>?"origin", ????Point?p???????????????????????????=>?$"({p.X},?{p.Y})", ????_?????????????????????????????????=>?"unknown" };
它利用一條switch語句完成了模式匹配,第一樣看上去要簡(jiǎn)潔一些。不過,它還有更多更簡(jiǎn)單的寫法。
Property patterns
可以直接通過在屬性上指定值作為判定條件,
static?string?Display(object?o)?=>?o?switch { ????Point?{?X:?0,?Y:?0?}?=>?"origin", ????Point?p???????????? =>?$"({p.X},?{p.Y})", ????_?????????????????? =>?"unknown" };
也可以將屬性值傳遞出來。
static?string?Display(object?o)?=>?o?switch { ????Point?{?X:?0,?Y:?0?}?????????=>?"origin", ????Point?{?X:?var?x,?Y:?var?y?}?=>?$"({x},?{y})", ????_????????????????????????????=>?"unknown" };
Positional patterns
利用解構(gòu)函數(shù),可以寫出更加精簡(jiǎn)的表達(dá)式。
static?string?Display(object?o)?=>?o?switch { ????Point(0,?0)?????????=>?"origin", ????Point(var?x,?var?y)?=>?$"({x},?{y})", ????_???????????????????=>?"unknown" };
如果沒有類型轉(zhuǎn)換,則可以寫得更加簡(jiǎn)單了:
static?string?Display(Point?o)?=>?o?switch { ????(0,?0)?????????=>?"origin", ????(var?x,?var?y)?=>?$"({x},?{y})" };
非空判斷
如果只是判斷空和非空,則有最簡(jiǎn)單的模式:
{?}??=>?o.ToString(), null?=>?"null"
Tuple patterns
也支持直接對(duì)ValueTuple進(jìn)行模式匹配,用起來非常靈活。
static?State?ChangeState(State?current,?Transition?transition,?bool?hasKey)?=> ????(current,?transition,?hasKey)?switch { ????(Opened,?Close,?_)?????=>?Closed, ????(Closed,?Open,??_)?????=>?Opened, ????(Closed,?Lock,?true)???=>?Locked, ????(Locked,?Unlock,?true)?=>?Closed, ????_?=>?throw?new?InvalidOperationException($"Invalid?transition") };
小結(jié)
C# 8.0的模式匹配有了進(jìn)一步的增強(qiáng),雖然可以又有人要說是語法糖了,但用得好的話可以讓你的代碼邏輯簡(jiǎn)化不少,更加容易理解。
參考文章
Do more with patterns in C# 8.0
到此這篇關(guān)于C#模式匹配的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c# xml轉(zhuǎn)word的實(shí)現(xiàn)示例
這篇文章主要介紹了c# xml轉(zhuǎn)word的實(shí)現(xiàn)示例,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-04-04C#解析json字符串總是多出雙引號(hào)的原因分析及解決辦法
json好久沒用了,今天在用到j(luò)son的時(shí)候,發(fā)現(xiàn)對(duì)字符串做解析的時(shí)候總是多出雙引號(hào),下面給大家介紹C#解析json字符串總是多出雙引號(hào)的原因分析及解決辦法,需要的朋友參考下吧2016-03-03C#實(shí)現(xiàn)對(duì)圖片文件的壓縮、裁剪操作實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)對(duì)圖片文件的壓縮、裁剪操作,較為詳細(xì)的介紹了操作過程中用到的相關(guān)類文件及具體的操作步驟,是非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09C#判斷一個(gè)類是否實(shí)現(xiàn)了某個(gè)接口3種實(shí)現(xiàn)方法
這篇文章主要介紹了C#判斷一個(gè)類是否實(shí)現(xiàn)了某個(gè)接口3種實(shí)現(xiàn)方法,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06C#實(shí)現(xiàn)從網(wǎng)絡(luò)同步標(biāo)準(zhǔn)北京時(shí)間的方法
這篇文章主要介紹了C#實(shí)現(xiàn)從網(wǎng)絡(luò)同步標(biāo)準(zhǔn)北京時(shí)間的方法,涉及C#操作時(shí)間的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03C#關(guān)鍵字in、out、ref的作用與區(qū)別
這篇文章介紹了C#關(guān)鍵字in、out、ref的作用與區(qū)別,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04