写点什么

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

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

关注

评论

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

计算机操作系统基础(七)---作业管理之死锁

书旅

php laravel 线程 操作系统 进程

程序员面试与 HR 谈薪资技巧

张小方

程序员 面试 offer 年终奖 月薪

架构师训练营第四周作业

W_T

消息队列(四)如何处理消息丢失的问题?

奈何花开

Java MQ 消息队列

架构师训练营作业-20200627

caibird1984

极客大学架构师训练营

极客时间架构师训练营 - week4 - 作业 1

jjn0703

极客大学架构师训练营

漫画:对象是如何被找到的?句柄 OR 直接指针?

王磊

Java 面试

聊聊Hystrix中的命令模式

老胡爱分享

Java 面试 设计模式 命令模式

Golang中的Interface(接口),全面解析

Eriol

接口 interface Go 语言

架构师训练营总结-20200627

caibird1984

极客大学架构师训练营

架构师是怎样炼成的 04-1互联网分布式系统架构演化

闷骚程序员

极客大学架构师训练营

极客大学算法训练营第一课

落曦

使用 Python 制作酷炫多彩的 Jenkins 插件词云图

donghui

jenkins wordcloud

第四周总结

芒夏

极客大学架构师训练营

Python多重继承问题之MRO和C3算法

wangkx

Python MRO C3算法 多继承

架构师训练营 第4周学习总结

Glowry

极客大学架构师训练营

戴尔Latitude 9510 雅典娜计划标准的英特尔移动超能版笔记本

最新动态

架构设计之常识篇

魔曦

架构师 极客大学架构师训练营

架构师训练营第三周作业

陈靓-哲露

时间管理的本质到底是什么?

非著名程序员

程序员 提升认知 时间管理

分布式计算DAG1-画猫

Hervor。

漫画:15张图,帮你看懂布隆算法

Java小咖秀

面试 算法 布隆过滤器

【6月】本月读书学到了什么

Neco.W

读书感悟 阅读量

架构师训练营:第四周作业

zcj

极客大学架构师训练营

理解了 1+2 的过程,你就理解了Java虚拟机

侯树成

JVM JVM原理

前端存储除了 localStorage 还有啥

阿宝哥

Java 大前端 存储

架构师训练营 第4周作业

Glowry

极客大学架构师训练营

一张PDF了解JDK9 GC调优秘籍-附PDF下载

程序那些事

性能调优 GC JDK9 cheatsheet 秘籍

架构师训练营第四周作业

Melo

消息队列(五)如何保证消息的顺序性?

奈何花开

Java MQ 消息队列

第四周作业

芒夏

极客大学架构师训练营

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