歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C# 7去掉了高級模式匹配特性

C# 7去掉了高級模式匹配特性

日期:2017/3/1 9:15:15   编辑:Linux編程

最初有望在C# 7中出現的高級模式匹配特性已於近日從future分支中排除出去,放入了該語言的下一個版本中。

Roslyn的GitHub庫已經明確了C# 7模式匹配的變化范圍。尤其是問題#10866(“將features/patterns分支分成兩個包含/不包含在C# 7中的子特性分支”)和PR #10888(“去掉高級模式匹配特性的證據”)詳盡地描述了這一變化的內容。

正如InfoQ幾周之前的報道,模式匹配會成為C# 7中最吸引人的新特性,對有F#或Haskell背景的程序員而言尤其如此。具體地,新模式匹配特性預計提供如下功能:

  • 增強case塊,允許基於類型或變量范圍切換代碼執行路徑,例如case int x:case int x when x > 0
  • 支持“分解(destructuring)”,當滿足指定條件時,允許開發人員將一個對象分拆成它自身的部分組件,並創建局部變量引用那些組件。語法if(person is Professor {Subject is var s, FirstName is "Scott"})提供了這方面的一個例子。

那麼,按照Roslyn問題#10866的描述,用於一些基本模式形式的語法“表達式 is 類型標識符”和“case 模式 when 表達式”已經移到了future分支,它們會包含在C# 7中。相反地,其他特性會留在patterns/features分支中,這個分支裡的特性“可能在以後的版本中提供”。

就是說,那些更高級的模式匹配特性將不會出現在C# 7中。Reddit用戶wreckedadvent發了一個帖子,有效地解釋了那些特性:

  • 遞歸模式形式,比如位置模式(比如p is Person("Mickey",*))、屬性模式(比如p is Person {FirstName is "Mickey"})、元組模式、通配符*,等等;
  • let關鍵字定義不可變變量(比如let x = e2 when e2 else stmt;),而不是可變var
  • match允許開發人員編寫下面這樣的代碼:

      var result = ...
      let message = result match (
        case Success<string> success: success.Result
        case Failure err: err.Message
        case *: "Unknown!"
      );
    
  • 基於用戶定義代碼的模式匹配,比如一個用戶定義的is操作符。

這在C#開發者社區裡引發了一些反響。一方面,那些更熱衷於函數式編程的開發者表示,缺少一個讓C#更加函數化的特性相對而言是一種欺騙。另一方面,其他開發人員表示,他們不關心或者很高興C#的演化受到了嚴格的控制。

查看英文原文:Advanced Pattern Matching Features Removed From C# 7

Copyright © Linux教程網 All Rights Reserved