ここでは、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を示します。
ループ変数
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
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)
~
(コンパイル失敗)
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 !
ビットシフト演算子
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)
~