Visual Basic 11には非同期関数や待望のイテレータなどの新しい機能が盛り込まれる。
Visual Basicの非同期はC#と同時にサポートされた。両者の非同期機能の設計とキーワードは同じである。つまり、AsyncとAwaitだ。このキーワードの基礎にあるのはTask Parallel Libraryであり、このライブラリは.NET 4.0で導入された。
理論的には非同期関数はどこでも使える。しかし、主に使われるのは慎重に扱わなければならないスレッドのブロッキングを避けるためだ。例えば、WPFやSilverlightアプリケーションのUIスレッドからファイル操作やサービス呼び出し、データベースアクセスを実行するときだ。非同期処理は完了すればUIスレッドに自動的にマーシャリングされるが、その間にブロッキングは発生しない。
また、ASP.NETで使われるスレッドプールでも利用できる。通常、ASP.NETは同時に起動できるスレッド数を制限して、コンテキストスイッチによる性能劣化を防ぐ。制限数は任意だが、ランタイムが多くのブロッキングを検出すると上限が上がる。このとき、ブロッキングをしない非同期呼び出しを使えば、システムは1スレッド1コアという理想的なモデルで処理を実行できる。
Visual Basic 11はイテレータ関数とイテレータブロックもサポートする。イテレータ関数は、わずかに構文が違うもののC#のイテレータのように動作する。VBでイテレータ関数を使う場合、普通の“Function”キーワードではなく、“Iterator Function”と宣言しなければならない。返却値は“Yield [式]”を使う。C#では“yield return [式]”だ。
Anthony Green氏はこの点を解説している。
Iteratorキーワードが導入されるおかげで、Yieldを識別子として使っているアプリケーション(例えば金融関連のアプリケーション)はソースコードの変更せずに済みますし、Yield Returnのようなキーワードのペアの代わりに簡潔なひとつのキーワードYieldを利用できます。しかし、Iteratorキーワードが導入される理由はこれだけではありません。VBは宣言的なスタイルを持っています(XMLリテラルやHandlesやImplements)。ある関数がイテレータの場合、シンプルに宣言できること。これがVBにとって重要なのだと思います。同様にIterator FunctionやAsync Functionを呼び出する場合も、シンプルに呼び出せるべきです。VBの修飾子にはこのようなシンプルな宣言が見られます。例えばReadOnlyやWriteOnlyのプロパティです。おそらく、Setterが無くともReadOnlyは同等の意味を持つのだから、ReadOnlyを使ってプロパティを宣言すればよいということなのでしょう。
明示的に宣言的な修飾子を使うことの利点は他にもあります。それは、エディタが使いやすくなるということです。VBでは"Iterator Function F As Integer"と入力するとIDEが自動的に"IEnumerable(Of Integer)"を挿入してくれます。同様に"Async Function F As Integer"とタイプすればIDEは"As Integer"を"As Task(Of Integer)"に置き換えてくれます。
また、興味深いのはラムダ式の一種のイテレータブロックをサポートしている点だ。下記の例は単純なラムダ式でInteger型のIEnumerableを作り、反復処理を行う。また、イテレータブロックは“End Function”行に“.Invoke()”を追加することでXMLリテラルを処理できる。
C#同様、Visual BasicもCallerMemberName、CallerLineNumber、CallerFilePath属性をサポートする予定だ。オプションのパラメータが適用されるとコンパイラは自動的に適切な値を挿入する。プロパティが変更されたときにロギングしたり通知したりするのが、これらの属性の使い方で最も一般的だ。
その他の改善点としては、
- Namespace Global。コード生成で使われる。
- オーバーロードメソッドのオプションパラメータ。後方互換性維持のために使われる。
- メソッドのシグネチャからのByValキーワードの除去。Visual BasicのIDEはバージョン7から自動的にこのキーワードを付加していた。