zoukankan      html  css  js  c++  java
  • C# 6与VB 12即将加入模式匹配

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

  • 相关阅读:
    Java 8 Lambda 表达式
    OSGi 系列(十二)之 Http Service
    OSGi 系列(十三)之 Configuration Admin Service
    OSGi 系列(十四)之 Event Admin Service
    OSGi 系列(十六)之 JDBC Service
    OSGi 系列(十)之 Blueprint
    OSGi 系列(七)之服务的监听、跟踪、声明等
    OSGi 系列(六)之服务的使用
    OSGi 系列(三)之 bundle 事件监听
    OSGi 系列(三)之 bundle 详解
  • 原文地址:https://www.cnblogs.com/gc2013/p/3945311.html
Copyright © 2011-2022 走看看