C# 8.0中的模式匹配

C# 8.0中的模式匹配相对C# 7.0来说有了进一步的增强,对于如下类:

class Point
{
    public int X { get; }
    public int Y { get; }
    public Point(int                xint     y) => (XY) = (xy);
    public void Deconstruct(out int xout int y) => (xy) = (XY);
}

首先来看C# 7.0中一个经典的模式匹配示例:

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中,它有更加精简的写法。

 

Switch表达式

在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语句完成了模式匹配,第一样看上去要简洁一些。不过,它还有更多更简单的写法。

 

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 { Xvar x, Yvar y } => $"({x}{y})",
    _                            => "unknown"
};

 

Positional patterns

利用解构函数,可以写出更加精简的表达式。

static string Display(object o) => o switch
{
    Point(0, 0)         => "origin",
    Point(var x, var y) => $"({x}{y})",
    _                   => "unknown"
};

如果没有类型转换,则可以写得更加简单了:

static string Display(Point o) => o switch
{
    (0, 0)         => "origin",
    (var x, var y) => $"({x}{y})"
};

 

非空判断

如果只是判断空和非空,则有最简单的模式:

{ }  => o.ToString(),
null => "null"

 

Tuple patterns

也支持直接对ValueTuple进行模式匹配,用起来非常灵活。

static State ChangeState(State current, Transition transitionbool hasKey) =>
    (currenttransitionhasKeyswitch
{
    (Opened, Close, _)     => Closed,
    (Closed, Open,  _)     => Opened,
    (Closed, Lock, true)   => Locked,
    (Locked, Unlock, true) => Closed,
    _ => throw new InvalidOperationException($"Invalid transition")
};

 

小结

C# 8.0的模式匹配有了进一步的增强,虽然可以又有人要说是语法糖了,但用得好的话可以让你的代码逻辑简化不少,更加容易理解。

 

参考文章

Do more with patterns in C# 8.0

转载于:https://www.cnblogs.com/TianFang/p/10322434.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值