Visual Basic 2017の新機能

  • 18
    いいね
  • 0
    コメント

はじめに

これは、Visual Basic Advent Calendar 2016の25日目の記事となります。

正式には現時点で「Visual Basic 2017」となることが発表されてなく、内部バージョンのVB15.0となっているですが、現在「Visual Studio 2017」のリリース候補版がダウンロードされている状態であり、2017年に発売(3月7日に決定)されることと推定されるため、あえてこのタイトルとしました。

VBの進化の歴史

新機能を紹介する前に、今までのVisual Basicの進化の歴史を整理してみます。

製品名 リリース 内部バージョン .NET Framework 変更点、備考
Visual Basic 6.0 1998 6.0 歴代VBの名作、未だに使われる
Visual Basic .NET 2002 7.0 1.0 初めての.NET
Visual Basic .NET 2003 2003 7.1 1.1 安定してきた.NET
Visual Basic 2005 2005 8.0 2.0,(3.0) 2005の新機能 - MSDN
Visual Basic 2008 2007 9.0 3.5,3.0,2.0 2008の新機能 - MSDN
Visual Basic 2010 2010 10.0 4.0 2010の新機能 - MSDN
Visual Basic 2012 2012 11.0 4.5 2012の新機能 - MSDN
Visual Basic 2013 2013 12.0 4.5.1 内部変更のみと思われる
Visual Basic 2015 2015 14.0 4.6 2015の新機能 - MSDN
Visual Basic 2017 2017 15.0 4.6.1,4.6.2 2017の新機能 - MSDN

※内部バージョン13.0は、忌み番号のためスキップされています。

VB2005(VB8.0)の新機能

参照:VS 2005で新しくなったVisual BasicとC#の新機能を総括

  • 部分クラス(パーシャル・クラス)
  • ジェネリック
  • プロパティの個別アクセシビリティ・レベル定義
  • My機能
  • Usingステートメント
  • フォームの既定インスタンス
  • Globalキーワード
  • 演算子のオーバーロード
  • Continueステートメント
  • XMLドキュメント・コメント

VB2008(VB9.0)の新機能

参照:Visual Basic 言語の新機能VBの進化

  • .NET Framework 2.0/3.0/3.5 に対応
  • LINQ(統合言語クエリ)に対応
  • Null 許容型に対応(「As Nullable(Of Integer)」を「As Integer?」と書ける)
  • 型推論(「Dim a = 10」と書くと「Dim a As Integr = 10」の意味になる)
  • オブジェクト初期化子(Dim a As New Point() With {.X = 10, .Y = 20})
  • 匿名型(「Dim a = New With {.Name = "名無しのV", .Job = "社会人"}」)
  • 拡張メソッドに対応(ExtensionAttribute 属性)
  • ラムダ式に対応(「Dim ave = Function(x As Integer, y As Integer) (x + y) / 2」)
  • XML リテラル、XML 軸プロパティ(「Dim a = xyz」)
  • If 演算子の追加(三項演算子)…If ステートメントとIIf関数を合わせたような物
  • 部分メソッド「Partial Private Sub」のサポート(VB2005 のPartial Classと併用する)

VB2010(VB10.0)の新機能

参照:Visual Basic 2010の新機能VBの進化

  • 行継続文字「 _」を省略可能になった(分割位置によっては省略できない場合もある)
  • コレクション初期化子に対応(「Dim a As New List(Of String)() From {"VB", "C#", "F#"}」)
  • 自動実装プロパティ(End Property無しの「Public Property Name As String」)
  • 複数行ラムダ式およびSub のラムダ式に対応
  • 並列処理の追加
     ・Parallel.Forメソッド、Parallel.ForEachメソッド
     ・Taskクラス
     ・Parallel LINQ (AsParallelメソッド)
  • VBランタイムの無効化オプション(/vbruntime オプション)
  • 動的オブジェクトのサポート(System.Dynamic 名前空間)
  • ジェネリックの共変性と反変性

VB2012(VB11.0)の新機能

参照:C#/VB言語の新機能

  • Async / Await キーワードによる非同期コードサポート
  • Iterator/Yield キーワードによる反復子
  • 呼び出し階層
  • メソッド情報
  • Global Namespaceのサポート

VB2013(VB12.0)の新機能

新機能の追加は一切ありません。(.NET Framework 4.5.1 に対応のみ)

VB2015(VB14.0)の新機能

参照:What's New for Visual Basic - MSDN

  • Nameof 演算子
  • 文字列の補間
  • Null 条件付きのメンバー アクセスとインデックス作成
  • 複数行の文字列リテラル
  • 複数行にまたがるステートメントに対するコメント
  • スマートな完全修飾名前解決
  • 年が最初にくる日付リテラル
  • ReadOnly インターフェイスのプロパティ
  • TypeOf IsNot
  • #Disable Warning と #Enable Warning
  • XML ドキュメント コメントの機能強化
  • 部分モジュールとインターフェイスの定義
  • メソッド本体内の #Region ディレクティブ
  • 上書きの定義は暗黙的オーバーロードです
  • 属性の引数で使用できる CObj
  • 異なるインターフェイスからのあいまいなメソッドの宣言と使用

備考

Visual Studio 2010以降からVisual Basic 6.0のアプリケーションをアップグレードする機能は組み込まれないようになりました。

VB6からVS2013にアップグレードする方法
手順は「VB6→VS2008→VS2013」となります。
VS2008 Expressは次のサイト等で入手できます。
NonSoft - Visual Studio 2008 Expressのダウンロードとインストール
Visual Basic 6.0 ユーザーのための Visual Basic .NET 移行ガイド
Microsoft.VisualBasic.Compatibility.VB6 名前空間は、.NET Framework Version 4以降Obsoleteとされるクラスである。

VB2017(VB15.0)の新機能

【2017/04/06追記】
英語ですがMSDNにて下記ブログが書かれました。
What’s New in Visual Basic 2017 - MSDN The Visual Basic Team

2進数リテラル

これまで16進数リテラルは&H、8進数リテラルは&Oとあったのですが、2進数リテラルはありませんでした。
MSX-BASICなどでは&Bで使えていたので、既にあるものと勘違いしてました。

Dim b1 As Byte = &B1111
Dim b2 As Byte = &B10101010
Dim s1 As Integer = &B1111000011110000
Console.WriteLine($"{b1:X}") 'F
Console.WriteLine($"{b2:X}") 'AA
Console.WriteLine($"{s1:X}") 'F0F0

数字区切り文字

' _ '(アンダースコア) を使って桁区切りが出来るようになりました。リテラルの桁数が大きい時に便利です。但し、末尾や先頭や小数点の前後には書けません。
※C#7.0と違い浮動小数点数(1.123_456_789)では使えないようです。

Dim s1 As Integer = &B1011_1100_1011_0011
Dim s2 As Integer = &B1_111_000_111_000_111
Dim x1 As Integer = &H44AA_ABCD
Dim million As Long = 1_000_000
Console.WriteLine($"{s1:X}") 'BCB3
Console.WriteLine($"{s2:X}") 'F1C7
Console.WriteLine($"{x1:X}") '44AAABCD
Console.WriteLine($"{million}") '1000000

タプル

タプルは、異なる型を要素として扱い複合的なデータを表現することが出来ます。

VB2010 (.net 4.0) から Tuple 型が使えるようになっていました。(元々は F# で複数の値を戻すための実装)

Function func() As Tuple(Of String, Integer, Double)
    Return Tuple.Create("aaa", 1, 2.0)
End Function

Sub Main()
    Dim a = func()
    Console.WriteLine("{0} {1} {2}", a.Item1, a.Item2, a.Item3)
End Sub

VB2017からは、Tupleキーワードが不要となります。
※使用するにはNugetから System.ValueTuple を導入する必要があります。(この制限は正式版ではなくなる予定→2017/03/09追記:正式版でも必要のまま)
参照:VisualBasic .net 15 の新機能

Function func() As (s As String, x As Integer, y As Double)
    Return ("aaa", 1, 2.0)
End Function

Sub Main()
    Dim a = func()
    Console.WriteLine("{0} {1} {2}", a.Item1, a.Item2, a.Item3)
    '結果 "aaa", 1, 2.0
End Sub

C# によるプログラミング入門 [データ型] タプルから一部だけVBに置き換えてみます。
型の明示 - ジェネリックな型の型引数

Dim dic = New Dictionary(Of (s As String, t As String), (x As Integer, y As Integer)) From
        {
            {("a", "b"), (1, 2)},
            {("x", "y"), (4, 8)}
        }

Console.WriteLine(dic(("a", "b"))) '(1,2)

ByRef return

イマイチ理解出来てないです、参照した中国ブログではC#との連携っぽいことが書かれていました。

【2017/04/06追記】MSDNの記事に詳しく書かれています。
参照:What’s New in Visual Basic 2017 - MSDN The Visual Basic Team

【2017/06/18追記】自分なりに調べて書いてみました。
【Visual Basic】ByRef returnについて

Visual Basic Language Design features

新機能の追加自体は今回少なかったですね。
VB2015の時に計画されていたが次のバージョンに持ち越した中で、2進数リテラルと数値区切りは、VB2017で採用されました。
他にもVisual Basicの言語デザインで将来計画されている内容を紹介します。採択されるかは不明です。
参照:Languages features in C# 6 and VB 14

Select Caseステートメントの拡張

数値や文字列だけであれば、今でもSelect Case文で問題ありません。しかし、型によるパターンマッチは今は出来ません。

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

Dictonaryの初期化方法の追加(! operatorの追加)

! 演算子 (bang operator | 感嘆符演算子) を使ってItemの記述を省略したい。

Dim customer = New JsonData With { 
                   !First = "Lucian", ' .Item("First") = "Lucian" 
                   !Last = "Wischik"  ' .Item("Last") = "Wischik"
               }

暗黙的に定義される参照引数(Output キーワードの追加)

C#のOut修復子をVBでも採用したかったと思われる。 C#のrefとoutの違い
(メソッド内でoutパラメータの値を使用することができず、必ずoutパラメータには新しい値を代入しなければなりません。)

' Callsite:
If Integer.TryParse(s, Output x) Then

' Declaration-site:
Function TryParse(s As String, Output x As Integer) As Boolean

Catchブロック内でのAwaitキーワードのサポート

C#のみサポートされて、VBはサポートされませんでした。

Dim res As Resource = Nothing
Try
    res = Await Resource.OpenAsync(...)   ' You could do this.
Catch ex As ResourceException
    Await Resource.LogAsync(res, e)   ' Now you can do this ...
Finally
    If res IsNot Nothing Then Await res.CloseAsync() ' ... and this.
End Try

最後に

Visual Basic Advent Calendar 2016の最後の記事でした。参加して頂いた皆様ありがとうございます。

C#は国際標準化機構 (ISO) によって標準化されているのに、Visual Basicはマイクロソフトの独自の言語ということもあって、歴史はあるけど人気はないですね。
UnityにはC#が採用されていますし、XamarinでもVB.NETは使えますがPCL 内で記述までとの制限があります。
※Xamarin iOSとAndroidプロジェクトは、Visual Basicをネイティブにサポートしていません。

Monoに関してもVisual Basic 8 = Visual Studio 2005 相当に留まっています。ただ、Linux環境においてはマイクロソフトのクロスプラットフォーム化によって、.NET CoreやRoslynがオープンソース化されていますので、ここはかなり改善される気がします。

これからもVisual Basicを暖かく見守っていきますので、来年もよろしくお願いします。

【2017/02/24追記】
InfoQの「.NETの将来に関するMicrosoftの計画」の記事によれば、将来の設計計画ではC#の設計からVBを切り離し、新しい開発者の.NETのファーストクラス言語としての位置付けとのこと。

この投稿は Visual Basic Advent Calendar 201625日目の記事です。