日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

C#8.0中的模式匹配_C#教程

作者:天方 ? 更新時(shí)間: 2022-08-27 編程語(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

欄目分類
最近更新