.NET Framework Version 1.1でのVB.NET言語仕様の変更点

注意:
この文書は以前「.NETでいきまっしょい!」で公開していたものですが、公開以降メンテナンスされていません。 今や古い情報となった内容が記載されている場合があるのでご注意ください。

0.始めに


 ここでは、.NET Framework Version 1.1におけるVB.NET言語仕様の変更点について検証していきます。 そのため.NET Framework SDK v1.1またはVisual Studio .NET 2003がインストールされていることが前提条件となっています。 ただ、僕はVS.NET 2003を持っていないので、SDKのみを用いてコマンドラインからコンパイルしています(笑)
 なお、文章中でVB.NET2003という表記をすることがありますが、これは「.NET Framework Version 1.1におけるVB.NET(またはVB.NETコンパイラ)」を示すことにします。

1.ループ変数


 以前のVB.NET(VB)では、For文で用いるループ変数はあらかじめ次のように宣言されている必要がありました。
001
002
003
004
005
Dim i As Integer

For i = 0 To 9
    ...
Next

 その一方、C++やC#では、ループ内でのみ用いられるループ変数は、次のようにfor文の中で宣言することができました。
001
002
003
004
for ( int i = 0; i <= 9; i++ )
{
    ...
}

 VB.NET2003では、このようなループ変数の宣言をFor文の中で行うことを許可しています。 上記のC#コードと全く同じコードをVB.NET2003で記述すると次のようになります。
001
002
003
For i As Integer = 0 To 9
    ...
Next

 試しに、次のコードを.NET Framework Version 1.0のvbc.exe(VB.NETコンパイラ)と.NET Framework Version 1.1のvbc.exeとでコンパイルしてみました。 コンパイラの出力結果と、実行結果も一緒に挙げておきます。
ソースコード
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
Imports System

Module Module1

    Sub Main()

        For i As Integer = 0 To 9

            Console.Write("{0}, ", i)

        Next i

        Console.WriteLine()

    End Sub

End Module
.NET Framework v1.0 vbc.exeの場合
Microsoft(R) Visual Basic .NET Compiler version 7.00.9466
for Microsoft(R) .NET Framework version 1.00.3705.288
Copyright (C) Microsoft Corporation 1987-2001. All rights reserved.

E:\test.vb(7) : error BC30451: 名前 'i' は宣言されていません。

        For i As Integer = 0 To 9
            ~
E:\test.vb(7) : error BC30035: 構文エラーです。

        For i As Integer = 0 To 9
              ~~
E:\test.vb(9) : error BC30451: 名前 'i' は宣言されていません。

            Console.Write("{0}, ", i)
                                   ~

(コンパイル失敗)
.NET Framework v1.1 vbc.exeの場合
Microsoft(R) Visual Basic .NET Compiler version 7.10.3052.4
for Microsoft(R) .NET Framework version 1.1.4322.573
Copyright (C) Microsoft Corporation 1987-2002. All rights reserved.

(コンパイル成功)
実行結果
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

 見ての通り、v1.0では全く文法エラーになってしまうのに対し、v1.1では問題なくコンパイルが成功しています。 また、その実行結果も意図した通りにものになっています。 このように、VB.NET2003ではC++やC#と同じような記法でループ変数を宣言できるようになっています。
 ただし、注意しておくべきこととして、このループ変数のスコープがあります。 C++やC#と同様、このように宣言したループ変数は、ループの中でのみ有効になります。 従って、次のようなコードはコンパイルエラーになります。
ソースコード
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
Imports System

Module Module1

    Sub Main()

        For i As Integer = 0 To 9

            Console.Write("{0}, ", i)

        Next i

        Console.WriteLine(i)

    End Sub

End Module
出力例
E:\test.vb(13) : error BC30451: 名前 'i' は宣言されていません。

        Console.WriteLine(i)
                          ~

 このようなループ変数はFor文だけではなくFor Each文に対しても使用することができます。 この表記はC#におけるforeach文とほとんど同様の形式と言えます。
ソースコード
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
Imports System

Module Module1

    Sub Main()

        Dim arr() As String = New String() {"Hello, ", "VB.NET ", "2003 ", "!"}

        For Each str As String In arr

            Console.Write(str)

        Next

        Console.WriteLine()

    End Sub

End Module
出力例
Hello, VB.NET 2003 !

2.ビットシフト演算子


 C/C++やC#にはビットシフト演算子<<と>>が存在します。 たとえば、C#でビットシフト演算子を使った例を挙げると次のような感じになります。
ソースコード
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
using System;

namespace BitShift
{
    class BitShift
    {
        static void Main()
        {
            int i = 32;
            
            // 左シフト
            Console.WriteLine( i << 5 );
            Console.WriteLine( i << 4 );
            Console.WriteLine( i << 3 );
            Console.WriteLine( i << 2 );
            Console.WriteLine( i << 1 );

            Console.WriteLine( i );

            // 右シフト
            Console.WriteLine( i >> 1 );
            Console.WriteLine( i >> 2 );
            Console.WriteLine( i >> 3 );
            Console.WriteLine( i >> 4 );
            Console.WriteLine( i >> 5 );
        }
    }
}
実行結果
1024
512
256
128
64
32
16
8
4
2
1

 VB.NET2003でもビットシフト演算子が導入されました。 演算子にはC++やC#と同じく、左シフトなら<<、右シフトなら>>の記号を用います。 ビットシフト演算子はByte, Short, Integer, Longなどの整数型のみに対して用いることができます。 次のコードはVB.NET2003でビットシフト演算子を使った例です。 上記のC#コードとほぼ等価なコードです。
ソースコード
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
Imports System

Module Module1

    Sub Main()

        Dim i As Integer = 32

        ' 左シフト
        Console.WriteLine(i << 5)
        Console.WriteLine(i << 4)
        Console.WriteLine(i << 3)
        Console.WriteLine(i << 2)
        Console.WriteLine(i << 1)

        Console.WriteLine(i)

        ' 右シフト
        Console.WriteLine(i >> 1)
        Console.WriteLine(i >> 2)
        Console.WriteLine(i >> 3)
        Console.WriteLine(i >> 4)
        Console.WriteLine(i >> 5)

    End Sub

End Module
実行結果
1024
512
256
128
64
32
16
8
4
2
1

 この例で挙げたコードのように、VB.NET 2003ではほとんどC++/C#と代わらないビットシフト演算をVB.NETでも行えるようになりました。 最後に、ビットシフト演算子を使ったソースコードをVB.NET 2002でコンパイルしようとするとどのようなエラーが出力されるかを見てみることにします。
ソースコード
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
Imports System

Module Module1

    Sub Main()

        Dim i As Integer = 32

        Console.WriteLine(i << 2)

        Console.WriteLine(i)

        Console.WriteLine(i >> 2)

    End Sub

End Module
実行結果
E:\test.vb(9) : error BC30201: 式が必要です。

        Console.WriteLine(i << 2)
                             ~
E:\test.vb(13) : error BC30201: 式が必要です。

        Console.WriteLine(i >> 2)
                             ~