红帽白皮书新鲜出炉!点击获取,让你的云战略更胜一筹! 了解详情
写点什么

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:402228
用户头像

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

关注

评论

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

TDengine 在蔚来能源系统的落地实践

TDengine

数据库 tdengine

直播回顾|TGIP-CN 036:Apache Pulsar 最新技术进展与动态

Apache Pulsar

开源 云原生 中间件 Apache Pulsar Apache Pulsar 社区

流动性挖矿开发模式,方案设计

Geek_232be3

流动性挖矿

fastposter v2.6.2 发布 程序员专属海报生成器

物有本末

Vue 海报 Pillow 海报生成器 电商海报

大咖说|网易数帆论道 PolarDB 数据库开源 & 存储生态

大咖说

数据库 阿里云 开源 网易

利用云效创建代码仓库,免费还方便

阿里云云效

git 云计算 阿里云 代码仓库 Codeup

怎么搭建在线帮助页面

小炮

帮助中心

艾特网能全面参与数据中心蒸发冷却空调系列标准编制

科技热闻

钉钉协同引擎与应用场景技术探索

阿里巴巴终端技术

分布式 跨平台 客户端 开发框架

多云管理需求分析与好用的工具介绍

行云管家

云计算 混合云 多云 云管理

设计模式—代理模式以及动态代理的实现

Linux服务器开发

c++ 设计模式 后端开发 Linux服务器开发 Linux后台开发

瞄准程序员招聘痛点,ShowMeBug让面试代码操作可“回放”

ShowMeBug

重视软件开发的黑匣子

菜根老谭

bug 系统安全 程序日志

DDoS攻击与防范策略

喀拉峻

网络安全 信息安全 DDoS

Apache ShardingSphere 首篇论文被 ICDE 收录,全球数据库发展迎来新局面

SphereEx

数据库 ShardingSphere SphereEx apache 社区

王者荣耀商城异地多活架构设计

王大胖

车联网平台百万级消息吞吐架构设计|车联网系列专题 05

EMQ映云科技

车联网 物联网 IoT emq 3月月更

BookKeeper PMC 成员翟佳受邀参与DataFunSummit 大数据存储架构峰会

Apache Pulsar

开源 架构 云原生 bookKeeper Apache Pulsar

活动报名|3DCAT实时渲染云行业生态合作系列沙龙之“云XR如何赋能虚拟仿真实验教学”线上活动邀您参会

3DCAT实时渲染

虚拟仿真 实时渲染

如何实现一个支持分级数据统计的增强型透视图

明道云

架构实战营作业一

热猫

架构

ModStartCMS模块化建站系统 v3.6.0 内容标签增强,电脑手机适配

ModStart开源

博文推荐|使用 Apache Pulsar 和 Scala 进行事件流处理

Apache Pulsar

开源 分布式 云原生 Apache Pulsar Apache Pulsar 社区

95 后新生代 Committer 贺张俭:谈谈年轻人的开源观

Apache Pulsar

开源 云原生 物联网 Apache Pulsar Apache Pulsar 社区

多终端运行小程序,快速丰富智慧社区使用场景

Speedoooo

智慧社区 小程序管理平台 智慧家居 智能家居生态平台 生态平台

RocketMQ 开源爱好者请注意邀您共探行业应用与生产实践

阿里巴巴云原生

阿里代码依赖漏洞检测服务,高效杜绝代码安全隐患

阿里云云效

云计算 阿里云 云原生 代码安全 依赖漏洞检测

成本管理系统解决方案

低代码小观

企业管理 资产管理 成本优化 低成本 CRM系统

NFT元宇宙开发Defi模式NFT游戏开发DAPP

Geek_232be3

区块链 NFT生态链游

【等保】二级等保是什么意思?哪些企业要做?多少钱?

行云管家

网络安全 等保 二级等保

流动性挖矿APP系统开发介绍模式

Geek_232be3

LIP流动性挖矿

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