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

C# 9.0 新特性之模式匹配簡(jiǎn)化的實(shí)現(xiàn)

 更新時(shí)間:2020年06月15日 09:59:48   作者:Liam Wang  
這篇文章主要介紹了C# 9.0 新特性之模式匹配簡(jiǎn)化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

記得在 MS Build 2020 大會(huì)上,C# 語言開發(fā)項(xiàng)目經(jīng)理 Mads Torgersen 宣稱 C# 9.0 將會(huì)隨著 .NET 5 在今年 11 月份正式發(fā)布。目前 .NET 5 已經(jīng)到了 Preview 5 階段了,C# 9.0 也已經(jīng)初具規(guī)模。忍不住激動(dòng)的心情,暫停更新《C#.NET 拾遺補(bǔ)漏》系列幾天,先要和大家分享一下我了解到的 C# 9.0 的新特性。由于新特性比較多,所以會(huì)分成幾篇來講。這是第一篇,專講模式匹配這個(gè)特性的簡(jiǎn)化。

模式匹配(Pattern Matching)是在 C# 7.0 引入的,是對(duì) switch 語句的增強(qiáng),可以支持實(shí)現(xiàn)復(fù)雜的條件匹配。下面我先用一個(gè)示例來展示一下模式匹配的一般的用法。

假如現(xiàn)在我們要計(jì)算各種車輛在某高速的通行費(fèi),比如有下面四種車輛,分別定義為以下四個(gè)類,各個(gè)類中定義了和通行費(fèi)計(jì)算相關(guān)的屬性:

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; }
}

下面用用模式匹配的方式來實(shí)現(xiàn)一個(gè)計(jì)算通行費(fèi)的方法:

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))
};

代碼來源于文末參考鏈接

如果上面代碼閱讀起來感覺吃力,你可以先閱讀文末參考鏈接中的第一個(gè)鏈接,關(guān)于模式匹配的詳細(xì)介紹。

實(shí)現(xiàn)這個(gè)業(yè)務(wù)邏輯,若在 C# 7.0 之前,需要用一堆的 if/else 來實(shí)現(xiàn)。有了模式匹配后,變得方便了很多,而且使用上很靈活,代碼結(jié)構(gòu)也更優(yōu)美。

對(duì)我來說,模式匹配是個(gè)極好的特性!但這還不夠,C# 9.0 對(duì)模式匹配的寫法做了進(jìn)一步的簡(jiǎn)化!

以上面代碼為例,模式匹配可以分為三種:簡(jiǎn)單模式、關(guān)系模式和邏輯模式。下面分別說說 C# 9.0 對(duì)三種模式的簡(jiǎn)化。

簡(jiǎn)單模式

以上面 CalculateToll 方法示例代碼為例,簡(jiǎn)單模式是這種:

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

我們其實(shí)可以發(fā)現(xiàn),上面的變量 c 聲明了卻沒用被使用,現(xiàn)在 C# 9.0 中可以把它省略了:

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

關(guān)系模式

以上面 CalculateToll 方法示例代碼為例,關(guān)系模式是通過比較(大小)關(guān)系來匹配的,對(duì)應(yīng)的代碼片段如下:

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

現(xiàn)在 C# 9.0 可以簡(jiǎn)寫成:

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

邏輯模式

在 C# 9.0 中,你可以通過邏輯操作符 and、or 和 not 對(duì)模式進(jìn)行組合,下面是一些示例:

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 關(guān)鍵字還可以用來替代 if 條件判斷中的邏輯非(!),比如:

// 原來的寫法
if (!(e is Customer)) { ... }

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

C# 9.0 還有很多其它好用的新特性,下一篇文章繼續(xù)與你分享。文章寫短一點(diǎn)不是因?yàn)槲彝祽泄?,而是為了促使大家一次性看完,方便大家在零碎時(shí)間閱讀,避免因文章太長(zhǎng)而成為“收藏不看”系列。

參考:

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

到此這篇關(guān)于C# 9.0 新特性之模式匹配簡(jiǎn)化的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# 9.0 模式匹配 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

作者:王亮
出處:http://cnblogs.com/willick
聯(lián)系:liam.wang@live.com

相關(guān)文章

最新評(píng)論