www.allbetgame.us:C# 9.0 新特征之模式匹配简化

admin 2个月前 (08-30) 科技 49 2

阅读本文也许需要 2 分钟。

记得在 MS Build 2020 大会上,C# 语言开发项目经理 Mads Torgersen 宣称 C# 9.0 将会随着 .NET 5 在今年 11 月份正式公布。现在 .NET 5 已经到了 PrevieW 5 阶段了,C# 9.0 也已经初具规模。忍不住激动的心情,暂停更新《C#.NET 拾遗补漏》系列几天,先要和人人分享一下我领会到的 C# 9.0 的新特征。由于新特征对照多,所以会分成几篇来讲。这是第一篇,专讲模式匹配这个特征的简化。

模式匹配(Pattern Matching)是在 C# 7.0 引入的,是对 switch 语句的增强,可以支持实现庞大的条件匹配。下面我先用一个示例来展示一下模式匹配的一样平常的用法。

若是现在我们要盘算种种车辆在某高速的通行费,好有下面四种车辆,划分界说为以下四个类,各个类中界说了和通行费盘算相关的属性:

public class Car
{
    public int Passengers { get; set; }
}

public class DeliveryTruck
{
    public int GrossWeightClass { get; set; }
}

public class Taxi
{
    public int Fares { get; set; }
}

public class Bus
{
    public int Capacity { get; set; }
    public int Riders { get; set; }
}

下面用用模式匹配的方式来实现一个盘算通行费的方式:

public decimal CalculateToll(object vehicle) =>
    vehicle switch
{
    Car { Passengers: 0}        => 2.00m + 0.50m,
    Car { Passengers: 1}        => 2.0m,
    Car { Passengers: 2}        => 2.0m - 0.50m,
    Car c                       => 2.00m - 1.0m,

    Taxi t => t.Fares switch
    {
        0 => 3.50m + 1.00m,
        1 => 3.50m,
        2 => 3.50m - 0.50m,
        _ => 3.50m - 1.00m
    },

    Bus b when ((double)b.Riders / (double)b.Capacity) < 0.50 => 5.00m + 2.00m,
    Bus b when ((double)b.Riders / (double)b.Capacity) > 0.90 => 5.00m - 1.00m,
    Bus b => 5.00m,

    DeliveryTruck t when (t.GrossWeightClass > 5000) => 10.00m + 5.00m,
    DeliveryTruck t when (t.GrossWeightClass < 3000) => 10.00m - 2.00m,
    DeliveryTruck _ => 10.00m,

    { } => throw New ArgumentException(message: "Not a known vehicle type", paramName: nameof(vehicle)),
    null => throw new ArgumentNullException(nameof(vehicle))
};

代码来源于文末参考链接

若是上面代码阅读起来感受吃力,你可以先阅读文末参考链接中的第一个链接,关于模式匹配的详细先容。

实现这个营业逻辑,若在 C# 7.0 之前,需要用一堆的 if/else 来实现。有了模式匹配后,变得利便了许多,而且使用上很天真,代码结构也更优美。

对我来说,模式匹配是个极好的特征!但这还不够,C# 9.0 对模式匹配的写法做了进一步的简化!

以上面代码为例,模式匹配可以分为三种:简朴模式、关系模式和逻辑模式。下面划分说说 C# 9.0 对三种模式的简化。

简朴模式

以上面 CalculateToll 方式示例代码为例,简朴模式是这种:

vehicle switch
{
    ...
    Car c => 2.00m - 1.0m
}

我们实在可以发现,上面的变量 c 声明了却没用被使用,现在 C# 9.0 中可以把它省略了:

vehicle switch
{
    ...
    Car => 2.00m - 1.0m
}

关系模式

以上面 CalculateToll 方式示例代码为例,关系模式是通过对照(巨细)关系来匹配的,对应的代码片断如下:

DeliveryTruck t when (t.GrossWeightClass > 5000) => 10.00m + 5.00m,
DeliveryTruck t when (t.GrossWeightClass < 3000) => 10.00m - 2.00m,
DeliveryTruck _ => 10.00m,

现在 C# 9.0 可以简写成:

DeliveryTruck t when t.GrossWeightClass switch
{
    > 5000 => 10.00m + 5.00m,
    < 3000 => 10.00m - 2.00m,
    _ => 10.00m,
}

逻辑模式

在 C# 9.0 中,你可以通过逻辑操作符 andornot 对模式举行组合,下面是一些示例:

DeliveryTruck t when t.GrossWeightClass switch
{
    < 3000 => 10.00m - 2.00m,
    >= 3000 and <= 5000 => 10.00m,
    > 5000 => 10.00m + 5.00m,
}

not null => throw new ArgumentException($"Not a known vehicle type: {vehicle}", nameof(vehicle)),
null => throw new ArgumentNullException(nameof(vehicle))

另外,not 关键字还可以用来替换 if 条件判断中的逻辑非(!),好比:

// 原来的写法
if (!(e is Customer)) { ... }

// 新的写法(易读性更好)
if (e is not Customer) { ... }

C# 9.0 另有许多其它好用的新特征,下一篇文章继续与你分享。文章写短一点不是由于我偷懒哈,而是为了促使人人一次性看完,利便人人在琐屑时间阅读,制止因文章太长而成为“珍藏不看”系列。

敬请关注我明天下一篇关于 C# 9.0 新特征的先容,明天不见不散。

参考:

  1. https://bit.ly/2MNc0DJ
  2. https://bit.ly/2UzEIwu
,

欧博APP下载

欢迎进入欧博APP下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

Allbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:www.allbetgame.us:C# 9.0 新特征之模式匹配简化

网友评论

  • (*)

最新评论

  • 环球UG开户 2020-06-29 05:16:11 回复

    Allbet Gmaing官网欢迎进入Allbet Gmaing官网(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。这就是最高水平

    1
  • Allbet官网 2020-08-30 00:00:25 回复

    联博以太坊www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。无聊了看这个呗

    2

文章归档

站点信息

  • 文章总数:488
  • 页面总数:0
  • 分类总数:8
  • 标签总数:860
  • 评论总数:184
  • 浏览总数:2827