やじゅ@アプリケーション・ラボ わんくま支局

目次

Blog 利用状況

ニュース

プロフィール

MSMVP

Visual Basic 2015以降の新機能 その1

これは、Visual Basic Advent Calendar 2014の12/8日の記事。

【VB2015(VB14.0)の新機能】参照:VBの新しいステートメントUpcoming Features in Visual Basic
1.Select Caseステートメントの拡張
2.読み取り専用の自動実装プロパティー
3.複数行にまたがった文字リテラル
4.yyyy-MM-dd型の日付リテラル
5.バイナリーリテラル
6.数値区切りリテラル
7.複数行にまたがるステートメントに対するコメント
8.バグ修正と小さな変更
9.C# Previewの変更で検討中の機能
10.その他

1.Select Caseステートメントの拡張について説明します。
この機能を確認しようとVisual Studio 2015 Preview版をインストールしましたが、結果的にはまだ未実装でした。

Roslynのコードリポジトリ上も、masterブランチにはまだとりこまれていない機能なのか、pattern-matchingっていうブランチが
見られます。この機能が最終的に実装されるか分かりません。
こういう機能を追加したいと思っているのは確かなので、とりあえず説明していきます。

以前からVBやC#に関数型言語の特徴までを取り入れようとするのが見受けれられましたが、今回も同様です。
F#などの関数型言語には大体パターンマッチがあります。構文的にはSelect Case文に近いです。
数値や文字列だけであれば、今でもSelect Case文で問題ありません。しかし、型によるパターンマッチは今は出来ません。
下記はF#による型パターンマッチです。図形の形と長さを出力しています。
shapeの型で分岐し、更にwhenにてw=hが同じ値なら正方形、違うなら四角形としています。

type Shape =
    | Rectangle of width:int * height:int
    | Circle of radius:int

let shape = Rectangle(10,10)
match shape with
| Rectangle(w,h) when w=h -> printfn "Square %d" w
| Rectangle(w,h) -> printfn "Rectangle %d, %d" w h
| Circle(r) -> printfn "Circle %d" r

これと同じことをSelect Caseステートメントでも出来るよう拡張するのが、今回の目的です。
Public MustInherit Class Shape
End Class

Public Class Rectangle
    Inherits Shape
    Public Property Width As Integer
    Public Property Height As Integer
End Class

Public Class Circle
    Inherits Shape
    Public Property Radius As Integer
End Class

Sub Main()
    Dim shape As Shape = New Rectangle With {.Width = 10, .Height = 10}
    Select Case shape
        Case r As Rectangle When r.Width = r.Height
            Console.WriteLine("Square of {0}", r.Width)
        Case r As Rectangle
            Console.WriteLine("Rectangle of {0},{1}", r.Width, r.Height)
        Case c As Circle
            Console.WriteLine("Circle of {0}", c.Radius)
    End Select
End Sub
他にも下記のような使い方もできます。
Private Sub Button_Click(sender As Object, e As EventArgs) Handles OKButton.Click, CancelButton.Click

    Select Case sender
        Case Is OKButton
            DialogResult = DialogResult.OK
            Close()
        Case Is CancelButton
            DialogResult = DialogResult.Cancel
            Close()
        Case Is Nothing
            Throw New NullReferenceException("sender")
        Case Else
            Debug.Fail("Unknown sender.")
    End Select      
End Sub

以上です、便利そうなので実装されるといいのですが…。

【追記】 幾つかの機能については次のVB15.0以降になるようです。
やはり、この時点でVisual Studio 2015 Preview版に実装されていないのは持ち越しのようです。
.NET Compiler Platform ("Roslyn") のサイトにて「Added」の項目は実装されています。

投稿日時 : 2014年12月8日 1:42

コメントを追加

No comments posted yet.
タイトル
名前
URL
コメント