又有一种源自于函数式编程语言中的概念加入了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)的基础上创建的。

1
2
3
4
5
public static bool operator is(Cartesian c, out double x, out double y)
    x = c.X;
    y = c.Y;
    return true;
}

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

1
2
3
4
5
6
7
8
9
10
11
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);

 类型模式

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

1
2
if (expr is Type v)
   { // code using v }

 递归模式

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

1
2
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语句块的功能将得到扩展,它将能够使用模式匹配特性。这实际上意味着你可以按以下方式编写语句:

1
2
3
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

C# 6与VB 12即将加入模式匹配的更多相关文章

  1. C# 6和 VB 12的最新特性列表

    随着下个版本的C#发布日逐渐临近,那些还没有完成的特性必须被砍掉.最近从特性列表中被砍掉的特性包括主要构造函数(primary constructor)和声明表达式(declaration expre ...

  2. Spark样本类与模式匹配

    一.前言 样本类(case class)与模式匹配(pattern matching)是Scala中一个比较复杂的概念,往往让人感觉深陷泥沼.我在这里对Scala中的样本类与模式匹配进行了一些整理,希 ...

  3. Scala详解

    1       快速入门... 4 1.1             分号... 4 1.2             常变量声明... 4 1.2.1         val常量... 4 1.2.2  ...

  4. 1、程序启动原理和UIApplication【转】

    一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个应用都有自己的UIApplica ...

  5. iOS开发UI篇—程序启动原理和UIApplication1

    iOS开发UI篇—程序启动原理和UIApplication   一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...

  6. 【转】iOS开发UI篇—程序启动原理和UIApplication

    原文 http://www.cnblogs.com/wendingding/p/3766347.html   一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程 ...

  7. 程序启动原理和UIApplication

    iOS开发UI篇—程序启动原理和UIApplication   一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...

  8. python 各模块

    01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支 ...

  9. [转]详解AppDelegate/UIApplication

    一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个应用都有自己的UIApplica ...

随机推荐

  1. Eclipse的SVN插件安装

    两种方法: 首先下载安装到eclipse的svn插件包,包里会有“plugins”和“features”两个文件夹,安装时要用到. 1.然后找到eclipse目录下的同名文件夹“plugins”和“f ...

  2. 【转】linux之fsck命令

    转自:http://www.linuxso.com/command/fsck.html 使用权限 : 超级使用者 使用方式 : fsck [-sACVRP] [-t fstype] [--] [fsc ...

  3. 序列for循环语句

    序列for循环语句 序列for循环语句允许重复遍历一组序列,而这组序列可以是任何可以重复遍历的序列,如由begin()和end()函数定义的STL序列.所有的标准容器都可用作这种序列,同时它也同样可以 ...

  4. Apriori算法例子

    1 Apriori介绍 Apriori算法使用频繁项集的先验知识,使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集.首先,通过扫描事务(交易)记录,找出所有的频繁1项集,该集合记做L1,然 ...

  5. iOS9对SDK的影响(iOS9适配必看)

      1.大部分社交平台接口不支持https协议. 问题描述:在iOS9下,系统默认会拦截对http协议接口的访问,因此无法获取http协议接口的数据.对ShareSDK来说,具体表现可能是,无法授权. ...

  6. 《Java数据结构与算法》笔记-CH5-链表-2单链表,增加根据关键字查找和删除

    /** * Link节点 有数据项和next指向下一个Link引用 */ class Link { private int iData;// 数据 private double dData;// 数据 ...

  7. SharePoint咨询师之路:设计之前的那些事一:容量

    提示:本系列只是一个学习笔记系列,大部分内容都可以从微软官方网站找到,本人只是按照自己的学习路径来学习和呈现这些知识. 咨询师更多的时候是解决方案提供者,那么他们如何能够提供有效的SharePoint ...

  8. ubuntu 14.04 64位系统编译RT288x_SDK

    sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sha ...

  9. USB设备不能用。提示Windows 无法启动这个硬件设备。 (代码 19)

    USB,由于其配置信息(注册表中的)不完整或已损坏, Windows 无法启动这个硬件设备. (代码 19) 原因:提示Windows 无法启动这个硬件设备. (代码 19) 处理解决方法: 1) r ...

  10. python 遍历删除日志

    #! /usr/bin/python2.6#-*- encoding:UTF-8 -*- import osimport os.pathimport time root_dir = os.getcwd ...