網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
C# 8.0中的模式匹配相對(duì)C# 7.0來(lái)說(shuō)有了進(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);
}
首先來(lái)看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)的寫(xiě)法。
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語(yǔ)句完成了模式匹配,第一樣看上去要簡(jiǎn)潔一些。不過(guò),它還有更多更簡(jiǎn)單的寫(xiě)法。
Property patterns
可以直接通過(guò)在屬性上指定值作為判定條件,
static?string?Display(object?o)?=>?o?switch
{
????Point?{?X:?0,?Y:?0?}?=>?"origin",
????Point?p???????????? =>?$"({p.X},?{p.Y})",
????_?????????????????? =>?"unknown"
};
也可以將屬性值傳遞出來(lái)。
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ù),可以寫(xiě)出更加精簡(jiǎn)的表達(dá)式。
static?string?Display(object?o)?=>?o?switch
{
????Point(0,?0)?????????=>?"origin",
????Point(var?x,?var?y)?=>?$"({x},?{y})",
????_???????????????????=>?"unknown"
};
如果沒(méi)有類型轉(zhuǎn)換,則可以寫(xiě)得更加簡(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)行模式匹配,用起來(lái)非常靈活。
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),雖然可以又有人要說(shuō)是語(yǔ)法糖了,但用得好的話可以讓你的代碼邏輯簡(jiǎn)化不少,更加容易理解。
參考文章
Do more with patterns in C# 8.0
原文鏈接:https://www.cnblogs.com/TianFang/p/10322434.html
相關(guān)推薦
- 2022-12-15 C++?Boost?Thread線程使用示例詳解_C 語(yǔ)言
- 2022-03-14 stream實(shí)現(xiàn)list根據(jù)對(duì)象中多個(gè)屬性分組,并取分組后最新數(shù)據(jù)
- 2022-06-20 Flutter?Navigator路由傳參的實(shí)現(xiàn)_Android
- 2021-12-09 Linux環(huán)境下安裝JDK1.8_Linux
- 2023-01-03 Redis實(shí)現(xiàn)優(yōu)惠券限一單限制詳解_Redis
- 2022-05-11 RabbitMq工作模式深度剖析與Spring整合MQ
- 2023-04-13 react native 配置路徑別名alias
- 2022-05-06 Python面向?qū)ο笾械姆庋b詳情_(kāi)python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支