ここでは、Visual Basic .NET 2003における言語仕様の変更点について検証していきます。 .NET Framework SDK v1.1またはVisual Studio .NET 2003がインストールされていることが必要ですが、VS.NET 2003が無いのでここではSDKのみを用いてコマンドラインからコンパイルしています。

なお、文章中でVB7.0, VB7.1という表記をすることがありますが、VB7.0はVisual Basic .NET、VB7.1はVisual Basic .NET 2003を示します。

§1 ループ変数

VB7.0以前では、For文で用いるループ変数はあらかじめ次のように宣言されている必要がありました。

Dim i As Integer

For i = 0 To 9
    ...
Next

その一方、C++やC#では、ループ内でのみ用いられるループ変数は、次のようにfor文の中で宣言することができました。

for ( int i = 0; i <= 9; i++ )
{
    ...
}

VB7.1では、このようなループ変数の宣言をFor文の中で行うことを許可しています。 上記のC#コードと全く同じコードをVB7.1で記述すると次のようになります。

For i As Integer = 0 To 9
    ...
Next

試しに、次のコードを.NET Framework Version 1.0のvbc.exe(VB7.0コンパイラ)と.NET Framework Version 1.1のvbc.exe(VB7.1コンパイラ)とでコンパイルしてみました。 コンパイラの出力結果と、実行結果も一緒に挙げておきます。

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では問題なくコンパイルが成功しています。 また、その実行結果も意図した通りにものになっています。 このように、VB7.1ではC++やC#と同じような記法でループ変数を宣言できるようになっています。

ただし、注意しておくべきこととして、このループ変数のスコープがあります。 C++やC#と同様、このように宣言したループ変数は、ループの中でのみ有効になります。 従って、次のようなコードはコンパイルエラーになります。

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文とほとんど同様の形式と言えます。

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#でビットシフト演算子を使った例を挙げると次のような感じになります。

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

VB7.1でもビットシフト演算子が導入されました。 演算子にはC++やC#と同じく、左シフトなら<<、右シフトなら>>の記号を用います。 ビットシフト演算子はByte, Short, Integer, Longなどの整数型のみに対して用いることができます。 次のコードはVB7.1でビットシフト演算子を使った例です。 上記のC#コードとほぼ等価なコードです。

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

この例で挙げたコードのように、VB7.1ではほとんどC++/C#と代わらないビットシフト演算をVB.NETでも行えるようになりました。 最後に、ビットシフト演算子を使ったソースコードをVB7.0でコンパイルしようとするとどのようなエラーが出力されるかを見てみることにします。

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)
                             ~