.NET 4中的模式匹配

case语句可以看作是if/else语法的特别版。他们的功能和作用是一样的,但有时case语句会令代码看起来更加清爽。考虑下面的C#和VB示例。

\
double CaclRateByDate(DayOfWeek day)\  {\      if (day == DayOfWeek.Monday)\      {\          return .42;\      }\      else if (day == DayOfWeek.Tuesday)\      {\          return .67;\      }\      else if (day == DayOfWeek.Wednesday)\      {\          return .56;\      }\      else if (day == DayOfWeek.Thursday)\      {\          return .34;\      }\      else if (day == DayOfWeek.Friday)\      {\          return .78;\      }\      else if (day == DayOfWeek.Saturday)\      {\          return .92;\      }\      else if (day == DayOfWeek.Sunday)\      {\          return .18;\      }\      throw new ArgumentOutOfRangeException(\"Unexpected enum value\");\  }
\
Function CaclRateByDate(ByVal day As DayOfWeek) As Double\    If day = Monday Then\        Return 0.42\    ElseIf day = Tuesday Then\        Return 0.67\    ElseIf day = Wednesday Then\        Return 0.56\    ElseIf day = Thursday Then\        Return 0.34\    ElseIf day = Friday Then\        Return 0.78\    ElseIf day = Saturday Then\        Return 0.92\    ElseIf day = Sunday Then\        Return 0.18\    Else\        Throw New ArgumentOutOfRangeException(\"Unexpected enum value\")\    End If\End Function
\

开发者需要一遍又一遍地编写“ElseIf day =”或“else if (day ==”这种语句,但却并没有增加任何信息。这种语句简直就是一种折磨,不停地分散开发者的注意力,我指的是DayOfWeek和返回值。

\

在VB和C#中,我们可以通过case语句进行简化。

\
double CaclRateByDate2(DayOfWeek day)\{\    switch (day)\    {\        case DayOfWeek.Monday:\            return .42;\        case DayOfWeek.Tuesday:\            return .67;\        case DayOfWeek.Wednesday:\            return .56;\        case DayOfWeek.Thursday:\            return .34;\        case DayOfWeek.Friday:\            return .78;\        case DayOfWeek.Saturday:\            return .92;\        case DayOfWeek.Sunday:\            return .18;\        default:\            throw new ArgumentOutOfRangeException(\"Unexpected enum value\");\    }\}\
\
Function CalcRateByDate2(ByVal day As DayOfWeek) As Double\    Select Case day\        Case Monday\            Return 0.42\        Case Tuesday\            Return 0.67\        Case Wednesday\            Return 0.56\        Case Thursday\            Return 0.34\        Case Friday\            Return 0.78\        Case Saturday\            Return 0.92\        Case Sunday\            Return 0.18\        Case Else\            Throw New ArgumentOutOfRangeException(\"Unexpected enum value\")\    End Select\End Function\\
\

即便如此还是有不少的重复代码。为什么总是不断地说需要一个返回值呢?像下面这样写岂不更好?

\
double CaclRateByDate2(DayOfWeek day)\{\    return switch (day)\    {\        DayOfWeek.Monday: .42;\        DayOfWeek.Tuesday: .67;\        DayOfWeek.Wednesday: .56;\        DayOfWeek.Thursday: .34;\        DayOfWeek.Friday: .78;\        DayOfWeek.Saturday: .92;\        DayOfWeek.Sunday: .18;\        default:\            throw new ArgumentOutOfRangeException(\"Unexpected enum value\");\    }\}
\
Function CalcRateByDate2(ByVal day As DayOfWeek) As Double\    Return Select Case day\        Monday: 0.42\        Tuesday: 0.67\        Wednesday: 0.56\        Thursday: 0.34\        Friday: 0.78\        Saturday: 0.92\        Sunday: 0.18\        Case Else\            Throw New ArgumentOutOfRangeException(\"Unexpected enum value\")\    End Select\End Function
\

在消除了那些不必要的重复后,你会发现C#和VB代码看起来是如此的接近。剩下的代码就是寻找的模式以及与模式所匹配的结果了。这就是众所周知的模式匹配

\

遗憾的是,在C# 4和VB 10中并没有提供该特性,但却有一门新语言提供了对模式匹配的支持。看看下面这个由 Mathew Podwysocki编写的F#示例(需要说明的是,在下面这些示例中都创建了相应的函数)。

\
let calcRateByDay2 (day:System.DayOfWeek) = \  match day with \  | System.DayOfWeek.Monday -\u0026gt; 0.42 \  | System.DayOfWeek.Tuesday -\u0026gt; 0.67 \  | System.DayOfWeek.Wednesday -\u0026gt; 0.56 \  | System.DayOfWeek.Thursday -\u0026gt; 0.34 \  | System.DayOfWeek.Friday -\u0026gt; 0.78 \  | System.DayOfWeek.Saturday -\u0026gt; 0.92 \  | System.DayOfWeek.Sunday -\u0026gt; 0.18 \  | _ -\u0026gt; failwith \"Unexpected enum value\"
\

接下来Mathew又介绍了同时检查多个参数的方式。下面这个示例将下划线当作通配符。

\
let allowUrl url port =\  match (url, port) with\  | \"http://www.microsoft.com/\
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值