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

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

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

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

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

假如現(xiàn)在我們要計算各種車輛在某高速的通行費,比如有下面四種車輛,分別定義為以下四個類,各個類中定義了和通行費計算相關(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; }
}

下面用用模式匹配的方式來實現(xiàn)一個計算通行費的方法:

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

代碼來源于文末參考鏈接

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

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

對我來說,模式匹配是個極好的特性!但這還不夠,C# 9.0 對模式匹配的寫法做了進一步的簡化!

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

簡單模式

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

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

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

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

關(guān)系模式

以上面 CalculateToll 方法示例代碼為例,關(guān)系模式是通過比較(大小)關(guān)系來匹配的,對應(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 可以簡寫成:

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

邏輯模式

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

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ù)與你分享。文章寫短一點不是因為我偷懶哈,而是為了促使大家一次性看完,方便大家在零碎時間閱讀,避免因文章太長而成為“收藏不看”系列。

參考:

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

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

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

相關(guān)文章

最新評論