BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Sergio De Simone 关注 12 他的粉丝 ,译者 谢丽 关注 9 他的粉丝 发布于 2016年5月31日. 估计阅读时间: 3 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

最初有望在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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT