欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#8.0中的模式匹配

 更新時(shí)間:2022年07月05日 10:04:07   作者:天方  
這篇文章介紹了C#8.0中的模式匹配,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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)文章

最新評(píng)論