在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

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

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

关注

评论

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

软件测试/测试开发丨性能测试体系学习笔记

测试人

软件测试

聊聊低代码技术

互联网工科生

软件开发 低代码

一物一码需求,标签制作功能轻松解决

草料二维码

二维码 二维码生成 标签制作 一物一码

云电脑与5G网络的结合将会带来什么

青椒云云电脑

云电脑

完蛋!我被 Out of Memory 包围了! | 京东云技术团队

京东科技开发者

Java Linux 内存泄漏 Out Of Memory 企业号11月PK榜

一个java文件的JVM之旅 | 京东物流技术团队

京东科技开发者

Java JVM 类加载机制 企业号11月PK榜

DDD技术方案落地实践 | 京东云技术团队

京东科技开发者

架构 领域驱动设计 DDD 企业号11月PK榜

首届OpenHarmony竞赛训练营结营颁奖,75所高校学子助力建设开源生态

OpenHarmony开发者

OpenHarmony

Mac 版截图工具链

Eric 老乌龟

macos 工具

分布式AI在LLM时代的技术深度探索

不在线第一只蜗牛

人工智能 AI lee

瓴羊X阿里云上的Salesforce联合解决方案正式发布

ToB行业头条

Unity中国全面支持OpenHarmony游戏开发,多款游戏率先完成适配

最新动态

Databend 开源周报第 118 期

Databend

体验问题哪里找?点击链接获取答案~ | 京东云技术团队

京东科技开发者

测试 用户体验 用户体验分析 企业号11月PK榜

免费好用的10款在线画板软件推荐,你值得拥有!

彭宏豪95

效率 科技 在线白板 办公软件 团队协作工具

OpenAI 深夜炸场,更强更便宜;英特尔 CEO 分享三大失败原因;黄仁勋说成龙长得像他丨 RTE 开发者日报 Vol.79

RTE开发者社区

如何寻找优质的谷歌seo优化公司来提升你的外贸网站排名

九凌网络

inBuilder低代码平台新特性推荐-第5期

inBuilder低代码平台

低代码

低代码工具的常见用例与受众市场

树上有只程序猿

低代码

华为云开源 | 线下meetup · 电子科技大学站圆满收官

华为云开源

云原生 开源项目 开源社区

荣誉 | 观测云登榜「2023 中国好 SaaS TOP 10 SaaS 企业 」

观测云

可观测性 SaaS

销售易取得500强客户背后的实践与进化

B Impact

使用openpyxl库读取Excel文件数据

不在线第一只蜗牛

工具 数据 Excel 教程

如何使用 NFTScan NFT API 在 Arbitrum 网络上开发 Web3 应用

NFT Research

NFT\ NFTScan nft工具 API 接口

喜报 | MIAOYUN通过2023年度四川省“专精特新”中小企业认定!

MIAOYUN

专精特新 MIAOYUN 高新技术企业 专精特新中小企业 专精特新企业

领跑同一阵营!百分点科技入选Forrester AI/ML权威报告

百分点科技技术团队

人工智能 数据科学 百分点科技

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