特集:VB 10概説

Visual Basic 2010の新機能

尾崎 義尚
2011/05/17
Page1 Page2 Page3 Page4

1. 軽く振り返り

 昨年発売されたVisual Studio 2010(以下、VS 2010)で、Visual Basic(以下、VB)はバージョン「10」(以下、VB 10)になった。.NETと統合されたのがバージョン「7」からなので、.NET対応版としても4つ目のバージョンになる。

 VB 10の仕様検討に当たり、マイクロソフトは言語チームを統合するという大きな決定をした。.NET Frameworkが発表されたとき、大きな特徴としてうたわれていたのが、さまざまな言語が使えることであった。実際にさまざまな.NET対応言語が開発されており、マイクロソフトからもC#、VB、F#、Python(IronPython)、Ruby(IronRuby)などが提供されている。

 VS 2008までは、それぞれの言語ごとに開発チームがあり、それぞれの言語の特徴に応じた実装がされていた。これによって、それぞれの言語ユーザーに最適な機能が実装できるという利点があったが、その一方で「C#で実装されているものがVBで実装されない」といった、言語ごとの格差が発生することになってしまった。

 そこで、マイクロソフトはVS 2010の開発に当たり、これら5つの言語チームを統合し、「Visual Studio Managed Languages Team」という1つのチームにした。また、C#とVBは、C#の言語設計者として知られるAnders Hejlsberg氏が2つの言語を同時に設計することにより、格差がなくなるようになっている。マイクロソフトはこれを「共進戦略(co-evolution strategy)」と呼んでいる。

 そうして生まれたVB 10は、C#の前のバージョンであるC# 3.5に実装されていながらVB 9に実装されていなかった機能に加えて、.NET Framework 4(以下、.NET 4)で新たに追加された機能にも対応している。本稿では、これらVB 10(以下では、Visual Studioのバージョン名に合わせて「VB 2010」と表記する)で新たに追加された機能について解説していく。

2. 「_」(アンダースコア)が不要になった=「暗黙の行継続」

 最初にお伝えしておく必要があるのが、この変更であろう。非常に小さい変更に見えるが、この効果は大きいし、恐らくコンパイラの変更も大きかったことは容易に想像できる。

 もともとVBは、行指向であるBASICの流れをくむ言語であるため、BASICと同様にステートメントの終わりは、行の終わりを基本としてきた。しかし、現実的にプログラムを作る場合、1行にしてしまうと読みづらくなることが多いため、行が終わっていないことを示す「行継続文字」という名前で、「_」(アンダースコア、アンダーライン)を記述することで、複数行にわたるステートメントを記述することができた。この記述方法は、VB 2008で採用されたLINQでも継続されており、長くなりがちなLINQのクエリ記述を読みやすいように改行するには、アンダースコアが必要であった。

 VB 2010ではこのルールを変更して、多くのVBプログラマーの夢であったアンダースコアの廃止(=暗黙の行連結)を実現したのである。

 今回の変更で、アンダースコアが必要になるケースはほとんどなくなった。では、具体的にどのような場合にアンダースコアを省略できるかを解説していこう。

(1)コンマ「,」の後
(2)かっこの前後
(3)中かっこの前後
(4)XMLリテラル内の埋め込み式の前後
(5)連結演算子「&」の後
(6)代入演算子「=」「&=」「:=」「+=」「-=」「*=」「/=」「\=」「^=」「<<=」「>>=」の後
(7)式内の二項演算子「+」「-」「/」「*」「Mod」「<>」「<」「>」「<=」「>=」「^」「>>」「<<」「And」「AndAlso」「Or」「OrElse」「Like」「Xor」の後
(8)Is演算子、IsNot演算子の後
(9)メンバーの修飾子文字「.」 の後
(10)XML軸プロパティ修飾子「.」「.@」「...」の後
(11)属性記号の前後
(12)クエリ演算子の前後
(13)For EachステートメントのInキーワードの後
(14)コレクション初期化子のFromキーワードの後

 それぞれの条件を具体的なコードで記述してみたので、以下のサンプル・コードを参考にしてほしい。

' (11)属性記号の前後
' (1)コンマ「,」の後
' (2)かっこの前後
<
ComponentModel.Description("ユーザーを登録します")
>
Public Sub RegistUser(
  ByVal userId As String,
  ByVal password As String,
  ByVal firstName As String,
  ByVal lastName As String,
  ByVal birthday As Date,
  ByVal prefecture As String,
  ByVal address As String
)
  ' (1)コンマ「,」の後
  ' (3)中かっこの前後
  ' (14)コレクション初期化子のFromキーワードの後
  Dim statuses As New Dictionary(Of Integer, String) From
  {
    {1, "申請"},
    {2, "課長承認"},
    {3, "部長承認"},
    {50, "承認済み"},
    {80, "差し戻し"},
    {99, "却下"}
  }

  ' (4)XMLリテラル内の埋め込み式の前後
  Dim xml = <Account>
          <Id>
            <%=
              userId
            %>
          </Id>
          <Password>
            <%=
              password
            %>
          </Password>
          <Name firstName=<%= firstName %> lastName=<%= lastName %>></Name>
        </Account>

  ' (10)XML軸プロパティ修飾子「.」「.@」「...」の後
  Dim id = xml.
      <Id>.
        Value
  Dim name = xml.
        <Name>.
          @firstName

  ' (5)連結演算子「&」の後
  ' (6)代入演算子「=」「&=」「:=」「+=」「-=」「*=」「/=」「\=」「^=」「<<=」「>>=」の後
  Dim userName =
      lastName &
      " " &
      firstName

  ' (2)かっこの前後
  ' (7)式内の二項演算子「+」「-」「/」「*」「Mod」「<>」「<」「>」「<=」「>=」「^」「>>」「<<」「And」「AndAlso」「Or」「OrElse」「Like」「Xor」の後
  Dim age = Date.Today.Year -
    birthday.Year
  If (
    Date.Today.Month <
      birthday.Month
  ) Or
  (
    Date.Today.Month =
      birthday.Month And
        Date.Today.Day <
          birthday.Day) Then
    age -= 1
  End If

  ' (8)Is演算子、IsNot演算子の後
  If prefecture Is
    Nothing And
      address IsNot
        Nothing Then
    address = Nothing
  End If

  ' (9)メンバーの修飾子文字「.」の後
  Dim addressLength = address.
              Length

  ' (12)クエリ演算子の前後
  Dim rejected = From status In statuses
           Where status.Key = 99
           Select status.Value

  rejected.Any(Function(rej)
           Console.WriteLine(rej)
           Return True
         End Function)

  Dim fullName = From account In Xml.Elements
           Select account.<Name>.@lastName & " " & account.<Name>.@firstName
  Console.WriteLine(fullName.First)

  ' (13)For EachステートメントのInキーワードの後
  For Each status In
          statuses
    Console.WriteLine(status.Value)
  Next

End Sub
暗黙の行継続の例
さまざまなケースで行継続文字を指定する必要がなくなっていることが分かる。

 このように、「すでに行継続文字を指定する必要がなくなった」といっても問題がないレベルだ。筆者が実際にコードを書いてみても、不自然な場所で改行した場合を除いて、行継続文字が必要になるケースはまったくなかった。もし、行継続文字がなくてコンパイル・エラーになってしまうときは、最初に自分が書いたコードの誤りをチェックし、それでも必要な場合にのみ書くことになるだろう。

 それでは、次のページからVB 2010の新機能を説明していこう。


 INDEX
  特集:VB 10概説
  Visual Basic 2010の新機能
  1.「_」(アンダースコア)が不要になった=「暗黙の行継続」
    2.C#から引き継がれた新機能:自動実装プロパティ/コレクション初期化子/複数行のラムダ式
    3.VB 2010の新機能:ジェネリックの共変性と反変性/動的プログラミングのサポート
    4.VB 2010の新機能:並列処理、 Visual Studio 2010 SP1の新機能


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH