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