連載

改訂版
プロフェッショナルVB.NETプログラミング

Visual Basic .NET 2003で拡張された機能

株式会社ピーデー 川俣 晶
2004/10/07
Page1 Page2


 本記事は、(株)技術評論社が発行する書籍『VB6プログラマーのための入門 Visual Basic .NET 独習講座』の一部分を許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。
 
Newキーワードで引数を指定しない場合の括弧

 まったく同じ内容を入力しても、VB.NET 2002とVB.NET 2003では括弧の有無が異なる場合がある。たとえば、VB.NET 2002で「Dim a As New Integer()」と入力すると、そのまま受け付けられるが、VB.NET 2003で同じ内容を入力すると、括弧が消えて「Dim a As New Integer」として受け付けられる。どちらの場合でも、動作の結果は同じである。また、本連載では解説していないが、IDEを使用せず、コマンドライン版のコンパイラでコンパイルする場合は、括弧を付けたソースをVB.NET 2003で使用できるが、それは受け付けられ、同じ結果になる。つまり、括弧の有無は言語仕様的にはどちらを使っても問題ないことになる。

 では、どうしてVB.NET 2003のIDEでは括弧を外してしまうのか? 『マイクロソフトサポート技術情報 - 828190』によれば、この現象が起きるのは、Visual Basic .NET 2003で、[ツール]-[オプション]-[テキスト エディタ]-[Basic]-[VB 固有]メニューから開くことができる「Visual Basic 固有のオプション」画面にある、「コードの再フォーマット」のチェックボックスが "ON" に設定されている場合であり、その理由として「これは、クラスのインスタンスを作成するコードと、配列宣言を行うコードの記述の混乱を回避するため、Visual Basic .NET 2003 にて仕様が変更されたためです」と述べられている。

 具体的に、どのようなコードが混乱を引き起こすのだろうか。それを見るために、以下のようなサンプル・ソースを記述してみた。まず、VB.NET 2002のものから。

 1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 2:   Dim a As New Integer()
 3:   Dim b As Integer()
 4:   b = New Integer() {0}
 5:   Trace.WriteLine(a.GetType().FullName)
 6:   Trace.WriteLine(b.GetType().FullName)
 7:
 8:   Dim p As New Point(123, 456)
 9:   Dim q As Point()
10:   q = New Point() {}
11:   Trace.WriteLine(p.GetType().FullName)
12:   Trace.WriteLine(q.GetType().FullName)
13: End Sub
リストA-5 括弧の有無で混乱を起こすプログラム(VB.NET 2002版)

 これと同じものを、VB.NET 2003に入力してみた。

 1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 2:   Dim a As New Integer
 3:   Dim b As Integer()
 4:   b = New Integer() {}
 5:   Trace.WriteLine(a.GetType().FullName)
 6:   Trace.WriteLine(b.GetType().FullName)
 7:
 8:   Dim p As New Point(123, 456)
 9:   Dim q As Point()
10:   q = New Point() {}
11:   Trace.WriteLine(p.GetType().FullName)
12:   Trace.WriteLine(q.GetType().FullName)
13: End Sub
リストA-6 括弧の有無で混乱を起こすプログラム(VB.NET 2003版)

 ここで注目すべき箇所は2行目である。この行の最後の括弧()は、VB.NET 2002に入力する場合はそのまま受け付けられるが、VB.NET 2003に入力されると除去されるものである。

 どちらを実行しても、まったく同じ結果になる(リストA-7)。つまり、括弧の有無は結果には影響していないことがわかる。

1: System.Int32
2: System.Int32[]
3: System.Drawing.Point
4: System.Drawing.Point[]
リストA-7 実行結果

 さて、何が問題とされているのか見てみよう。

 VB.NET 2002版の2行目と3行目を比較してみよう。2行目はInteger型の変数の宣言である。3行目はInteger型配列変数の宣言である。Visual Basicでは、()の存在は配列を意味することが多かったので、うっかりすると2行目も配列の宣言のように見えてしまうかも知れない。しかし、括弧が除去されたVB.NET 2003版のソースでは、そのような誤解は起こりにくいといえる。

 しかし、この対策は万能ではないことに注意が必要である。8行目のように、引数がある場合、VB.NET 2003でも括弧は取り除かれないためだ。8行目は、Point構造体のコンストラクタへの引数を記述しているが、これが配列を宣言しているかのように見える可能性は否定できない。

 これに対する対策は、早くVB.NETの構文に慣れ、配列を示す括弧と、コンストラクタの引数を囲む括弧の相違がわかるようになるしかないだろうEnd of Article

VB6プログラマーのための入門 Visual Basic .NET 独習講座』

 本記事は、(株)技術評論社が発行する書籍『VB6 プログラマーのための 入門 Visual Basic .NET 独習講座』から
許可を得て転載したものです。

【本連載と書籍の関係について 】
 この書籍は、本フォーラムで連載した「連載 プロフェッショナルVB.NETプログラミング」を大幅に加筆修正し、発行されたものです。技術評論社、および著者である川俣晶氏のご好意により、書籍の内容を本フォーラムの連載記事として掲載させていただけることになりました。

技術評論社の解説ページ

ご注文はこちらから
 
 

 INDEX
  [連載] 改訂版 プロフェッショナルVB.NETプログラミング
  Visual Basic .NET 2003で拡張された機能
    1.ループ内でのループ変数の宣言/シフト演算子
  2.Newキーワードで引数を指定しない場合の括弧
 
「改訂版 プロフェッショナルVB.NETプログラミング 」


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