QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

C# 6 与 VB 12 即将加入模式匹配

  • 2014-08-17
  • 本文字数:1249 字

    阅读完需:约 4 分钟

又有一种源自于函数式编程语言中的概念加入了 C#和 VB 的阵营,这就是被称为模式匹配(Pattern Matching)的特性。初看上去,模式匹配的作用类似于一段 switch/select 语句块,但它的功能要强大的多。

请注意:由于 VB 版本的规格说明现在还没有完成,因此这些示例主要都是来自于 C#中的模式匹配规格说明

is 或 Matches 操作符

.NET 中的模式匹配主要是通过“is/Matches”操作符支持的。这种还让人不太熟悉的操作符将一个类分解为多个组成部分。以下这个示例是基于在周二的新闻报道中所提到过的 Cartesian 记录类 http://www.infoq.com/news/2014/08/Record-Class (record class)的基础上创建的。

复制代码
public static bool operator is(Cartesian c, out double x, out double y)
x = c.X;
y = c.Y;
return true;
}

这个 is 操作符不仅限于在它的定义类中使用,以下这个示例以另一种方式定义了一个操作符,使它能够分解一个 Cartesian 对象,让它能够匹配一个 Polar 对象。

复制代码
public static class Polar {
public static bool operator is( Cartesian c, out double R, out double Theta)
{
R = Math.Sqrt(c.X*c.X + c.Y*c.Y);
Theta = Math.Atan2(c.Y, c.X);
return c.X != 0 || c.Y != 0;
}
}
var c = Cartesian(3, 4);
if (c is Polar(var R, *))
Console.WriteLine(R);

类型模式

最简单的模式是类型模式,它本质上就是尝试进行类型转换并同时赋给某个变量。以下是这种模式的一个示例:

复制代码
if (expr is Type v)
{ // code using v }

递归模式

多数模式都是作为递归模式的形式出现,意即它们是由较简单的模式所组成的。看一下这种模式的示例:

复制代码
var a = new Location(1, 2, 3); //x=1, y=2, z=3
if (a is Location(1, var y, *))

这个递归模式包括了一个常数模式,一个 var 模式和一个通配符模式。

常数模式

这个模式可以将一个属性与一个常数值进行匹配,常数匹配使用 object.Equals(left, right) 方法来判断两者是否匹配。

Var 模式

Var 模式是一定会匹配成功的,该模式对应的变量将会被赋值为调用该 is 操作符时所提供的值,而该变量的类型则是由该表达式所决定的静态类型。

通配符模式

通配符模式本质上来说就是 var 表达式,不过你不需要关心匹配的结果。

内部实现

让我们继续讨论一下这个 location 类的示例,编译器在编译阶段会进行以下几个步骤的处理:

  1. 创建变量 $x、$y 和 $z
  2. 调用 Location.is(a, out $x, out $y, out $z) 方法,并确认返回结果为 true
  3. 常数模式:检查 object.Equals($x, 1) 调用的结果
  4. Var 模式:将 $y 赋给 y
  5. 通配符模式:忽略 $z 变量

Switch/Select Case 语句块

Switch 语句块的功能将得到扩展,它将能够使用模式匹配特性。这实际上意味着你可以按以下方式编写语句:

复制代码
case null:
case String s
case Location(1, var y, *):

限制

在目前的规格草稿中,还没有对于范围检查的支持。这意味着你不能编写类似于“a is Location( > 0, 1 to 5, <= 10)”这样的代码。此外目前也不支持在一个列表或迭代器中进行元素匹配。

查看英文原文: Pattern Matching in C# 6 and VB 12

2014-08-17 01:402441
用户头像

发布了 428 篇内容, 共 184.4 次阅读, 收获喜欢 39 次。

关注

评论

发布
暂无评论
发现更多内容

kubernetes是微服务发展的必然产物

架构师修行之路

Kubernetes 分布式 微服务

读——沟通的艺术,看入人里,看出人外(第三章)

废材姑娘

《谛听说智能》迎来圆满落幕,企业降本增效新指南

Geek_e670ab

Week 2 学习总结

balsamspear

极客大学架构师训练营

MySQL-技术专题-mysql的联合索引

码界西柚

中国首个“芯片大学”即将落地;生成对抗网络(GAN)的数学原理全解

京东科技开发者

技术 网络 GAN 芯片

图解超难理解的 Paxos 算法(含伪代码)

多颗糖

分布式 算法 分布式系统 架构师 一致性算法

深拷贝链表,python处理音频信号和数字信号、vim教程、swift单元测试和UI测试 John 易筋 ARTS 打卡 Week 21

John(易筋)

单元测试 ARTS 打卡计划 python 数字信号 vim教程 深拷贝链表

都别拦着我,我要删库了

MySQL从删库到跑路

Linux oracle重装 MySQL 运维 root

浅析:线程安全

朱华

Java 多线程与高并发

架构师训练营第 1 期 - 第四周课后练习

Anyou Liu

极客大学架构师训练营

MySQL-技术专题-解决死锁问题

码界西柚

头条终面:写个消息中间件

yes

面试 消息队列

第四周 作业二:系统架构学习总结【未陌】

a d e

系统架构 互联网架构

第四周 作业一:系统架构【未陌】

a d e

系统架构

IDEA常用设置、快捷键及代码模板

jiangling500

IDEA

JAVA中的内部类详解

倔强的攻城狮

Java

MySQL-技术专题-事务和并发一致性问题

码界西柚

有状态的服务其实可以做更多的事情

架构师修行之路

分布式 微服务

Week 2命题作业

balsamspear

极客大学架构师训练营

学习笔记:架构师训练营-第四周

四夕晖

高并发 系统架构演化

mybatis plus 自动更新数据库时间的小坑

废材姑娘

Java mybatis

后疫情时期,看区块链如何赋能文创产业加快经济复苏?

CECBC

区块链技术 文创产业

当我在听播客时,我在听什么?

Nydia

甲方日常 29

句子

工作 随笔杂谈 日常

【高并发】秒杀系统架构解密,不是所有的秒杀都是秒杀(升级版)!!

冰河

并发编程 高并发 架构设计 秒杀 异步

反向保理系统设计

森林

Kubeless 架构设计 | 玩转 Kubeless

donghui

Serverless kubeless

数字经济2.0—趋势、逻辑、选择

CECBC

区块链 数字经济

打破区块链游戏经济的隔阂,或许该从跨游戏资产入手

CECBC

区块链 游戏

Netty源码解析 -- 服务端启动过程

binecy

Netty nio

C# 6与VB 12即将加入模式匹配_C#_Jonathan Allen_InfoQ精选文章