C#8.0中的模式匹配

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C#8.0中的模式匹配
C# 8.0中的模式匹配相对C# 7.0来说有了进⼀步的增强,对于如下类:
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中⼀个经典的模式匹配⽰例:
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 { X: var x, Y: var 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 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")
};
⼩结
C# 8.0的模式匹配有了进⼀步的增强,虽然可以⼜有⼈要说是语法糖了,但⽤得好的话可以让你的代码逻辑简化不少,更加容易理解。

参考⽂章。

相关文档
最新文档