|
|
連載
プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――
第2回 データ型の処理
(株)ピーデー
川俣 晶
2002/04/04
|
まずは小さなプログラムから
VB 6とVB.NETの間には共通点も多いが、相違点も多い。まずは“論よりソース”ということで、小さなプログラムを比較してみることから始めよう。なお、この連載では、特に記さない限り、Visual Studio .NET(VB 6の場合はVisual Studio 6.0)上で[Windowsアプリケーション]のテンプレートによりプロジェクトを新規作成し、フォームのLoadイベント・ハンドラ(プログラムのロード時に実行されるイベント・ハンドラ)にサンプル・コードを書き込む方法をとるものとする。結果は、VB 6ならイミディエイト・ウィンドウ、VB.NETなら出力ウィンドウに表示させるように作成する。
まず、こんな小さなプログラムをVB 6で書いてみた。
1: Private Sub Form_Load()
2: a = 1
3: b = "2"
4: Debug.Print a + b
5: End Sub
|
|
VB 6で記述した小さなサンプル・プログラム1 |
これは変数宣言も行わず、無造作に整数と数字の文字列を加算して、それをイミディエイト・ウィンドウに出力させている。このように変数を宣言しなくても、またデータ型の違いを意識しなくても、適当にソースを書くと何となく結果が得られるのがこれまでのVisual Basicらしさといえるだろう。これを実行すると、期待どおり「3」という数字が出力される。
では、これと同等のソース・コードをVB.NETで作成してみよう。Visual Studio .NET(以下VS .NET)で[Windowsアプリケーション]のテンプレートでプロジェクトを新規作成し、フォームをダブルクリックするとコード・ウィンドウが表示される。そこで以下のようにソースを書き込んで[F5]キーを押せば実行できる。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim a, b
3: a = 1
4: b = "2"
5: Trace.WriteLine(a + b)
6: End Sub
|
|
サンプル・プログラム1をVB.NETで書き換えたサンプル・プログラム2 |
結果は同じく「3」となるが、いくつかの相違がソース上に現れていることが分かるだろう。まず、“Private Sub 〜”の宣言行の相違はここでは無視することにしよう。これはIDEが自動生成してくれたものなので、自分で書く必要がないからだ。次に気付くのは、VB 6のソースにはなかったDimステートメントだろう。VS .NETで作成したプロジェクトは、生成時のデフォルト設定で“Option Explicit機能”がオンとなっており、ソース・コード上に“Option Explicit”の文字が見えなくても、それが記述された場合と同等の効力を発揮する。つまり、VB.NETでは宣言されていない変数は使用できず、必ずDimステートメントで使用する変数を宣言しなければならないのである。なお、この設定は、プロジェクトのプロパティから変更することができる。しかし、通常はこの設定は変更せず、必ず変数宣言を行うように習慣付けた方がよいだろう。変数のスペル・ミスはソースを見ても気付きにくく、無駄な時間を使いがちである。これに対し宣言を習慣付ければ、変数のスペル・ミスをコンパイラが発見してくれる確率が高くなり、バグの早期発見に役立つはずだ。
次は、最後のDebug.PrintがTrace.WriteLineに変わっている点が目に付くだろう。Debug.PrintはVB 6の言語仕様の一部を構成する機能で、Visual Basicだけが使うものである。一方、Trace.WriteLineは、.NET Frameworkのクラス・ライブラリの一部として提供されるもので、.NET Framework上のすべてのプログラム言語から利用可能な機能である。つまり共通のライブラリに機能が提供されたため、VB 6だけで利用可能な機能の出番はなくなり、退場したということである。変わってしまったものは仕方ないので、素直に名前を書き換える必要がある。
さて、もう1つこの行で目に付くのは、括弧の有無だろう。VB 6ではDebug.Printの引数を括弧でくくる必要はなかったが、VB.NETのTrace.WriteLineでは括弧でくくらなければならない。VB 6では、Functionキーワードで宣言された関数を呼び出す際に引数を括弧でくくる必要があったが、Subキーワードなどで宣言された手続きを呼び出す際には括弧は不要だった。しかし、VB.NETでは、どちらの場合でも括弧が必要になった。これも、素直にそういうものだと思い、ひたすら括弧を付けるように習慣付ければよいだろう。
こまごま見ていくと、かなりの大変更と思うかもしれないが、変わっていない点もある。例えば、整数と、整数を表現した文字列を型の違いも考えずに無造作に足し算して、きちんと計算結果の3が得られているというのは、C++やC#といったほかの言語とは異なるVisual Basicらしい挙動なのである。そのようなVisual Basicらしい特徴は、VB.NETにも継承されている。
VariantとObject
上記のサンプル・ソースには、もう1つ記述されていない重要な相違がある。それは、Dimステートメントでデータ型を明示せずに宣言された変数のデータ型の相違である。VB 6には、「何でも入る魔法の箱」として、Variant型というデータ型が存在する(「Variant」は「さまざまの」「いろいろの」という意味)。VB 6では、データ型を明示せずに宣言した変数はVariant型になるため、どんなデータを入れるにせよ、取りあえず使えるようになる。変数がVariant型であることを、ソース上にはっきり示すように変更したサンプル・ソースを以下に示す。
1: Private Sub Form_Load()
2: Dim a As Variant, b As Variant
3: a = 1
4: b = "2"
5: Debug.Print a + b
6: End Sub
|
|
Variant型を明示的に宣言しているVB 6のサンプル・プログラム3 |
さて、VB.NETでは、「何でも入る魔法の箱」をObject型と呼ぶ。そのため、VB 6でVariantと記述していた部分は、Objectと書き換えねばならない。以下はそのように記述したサンプル・ソースである。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim a As Object, b As Object
3: a = 1
4: b = "2"
5: Trace.WriteLine(a + b)
6: End Sub
|
|
Variant型の代わりにObject型を使用するVB.NETのサンプル・プログラム4 |
この2つのソース・コードは、意味的に同じことを記述している。VariantというキーワードはVB 6までのVisual Basic専用で、VB.NETではObjectを使う。しかし、VB 6ではObjectというキーワードが別の意味で使われていたことを忘れてはならない。VB 6でのObjectは、オブジェクトを扱うデータ型であり、オブジェクトではないデータを格納するためには使用できなかった。しかし、VB.NETでは、整数などの基本的なデータ型も含め、すべてをオブジェクトとして扱えるように拡張されたので、ObjectがあればVariantは不要になったのである。
VB 6のVariantはVB.NETではObjectに書き換えるというルールを覚えると同時に、VB 6のObjectとVB.NETのObjectは機能的に同じではないことも頭に入れておこう。
Insider.NET 記事ランキング
本日
月間