|
|
連載
改訂版 プロフェッショナルVB.NETプログラミング
Chapter 13 オプション機能
株式会社ピーデー
川俣 晶
2004/08/19 |
|
Visual Basicには、プログラム言語としての動作を変更するオプション機能が存在する。VB 6では「Option Base」と「Option Explicit」の2種類だったが、VB.NETでは「Option Explicit」「Option Strict」「Option Compare」そして「整数のオーバーフロー・チェック」の4種類が存在する。これらの設定が変更されると、実行結果が変化する場合があるので、他人の書いたVB.NETのソース・コードを扱う場合には、どのような設定で使われているかを確認する必要がある。これらのオプション機能による動作の相違を把握しておこう。
VB 6では、リスト13-1のような変数宣言のない安易なプログラムをいきなり入力して実行することができた。
1: Private Sub Form_Load()
2: a = 2
3: b = 3
4: Debug.Print a * b
5: End Sub
|
|
リスト13-1 変数宣言せずに変数を使用するVB 6のプログラム
|
しかし、VB.NETでは、プロジェクトを作成した後、同様のプログラムを書き込んでも実行できない。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: a = 2
3: b = 3
4: Trace.WriteLine(a * b)
5: End Sub
|
|
リスト13-2 変数宣言せずに変数を使用するVB.NETのプログラム(コンパイル不可)
|
リスト13-2をビルドすると、次のようなエラー・メッセージが表示される。
1: Q:\aWrite\@it\vbn\022\smpl\Sample001n\Form1.vb(46) : error BC30451: 名前 'a' は宣言されていません。
2: Q:\aWrite\@it\vbn\022\smpl\Sample001n\Form1.vb(47) : error BC30451: 名前 'b' は宣言されていません。
3: Q:\aWrite\@it\vbn\022\smpl\Sample001n\Form1.vb(48) : error BC30451: 名前 'a' は宣言されていません。
4: Q:\aWrite\@it\vbn\022\smpl\Sample001n\Form1.vb(48) : error BC30451: 名前 'b' は宣言されていません。
|
|
リスト13-3 リスト13-2をコンパイルすると出力されるエラー・メッセージ
|
この挙動の相違が、「Option Explicit」という機能の初期値の違いによることは、言語仕様の変化ですでに述た。VB 6では、Option Explicitを指定しなければ、宣言しない変数はVariant型のローカル変数として自動的に宣言されたものと見なされる。逆にこれを指定すると、宣言されていない変数はすべてエラーになる。
VB 6でも、ソース・コードの先頭に以下の1行を追加すれば、VB.NETと同じ挙動になる。あるいは、ツールメニューのオプションで「変数宣言を強制する」をチェックしてからプロジェクトを作成することで、初期状態でこの行をソース・コードに含めることもできる(詳しい手順は、プロジェクトのプロパティによるオプション機能の設定で述べる)。
Option Explicit
また、VB.NETでも、ソース・コードの先頭に以下の1行を追加すれば、VB 6と同じ挙動になりコンパイルできるようになる。
Option Explicit Off
あるいは、プロジェクトのプロパティから、コンパイラの既定値を変更することでも実現できる。
ここで明らかになったことは、オプション機能の設定によって、ビルド可能なソース・コードが、ビルド不可能に変わる場合があるということである。これは、VB.NETのコードを扱ううえで、オプション機能の設定が極めて重要な意味を持つことを示している。VB.NETでは、オプション機能の種類が増えているうえ、指定方法もソース・コード中で記述するほかに、プロジェクトのプロパティで設定する方法もあり、複雑さの度合いが増している。そのため、オプション機能の扱いを間違えると、トラブルになりやすい。
なお、マイクロソフト社による『Visual Basic .NET言語仕様』の「5.1 コンパイル・オプション」で、「言語の意味に影響を与える4つのコンパイル・オプションがあります」と説明されているが、この4つとは、「Option Explicit」「Option Strict」「Option Compare」そして「整数のオーバーフロー・チェック」である。このうち、整数のオーバーフロー・チェックのみ、対応する宣言文がなく、ソース・コード上で指定できない。
VB 6では「Option Base」というステートメントもあり、配列の添え字のデフォルトの開始値が0か1かを指定することができたが、配列添え字の下限で説明したとおり、VB.NETには存在しない。
オプション機能の指定は、ソース・コードにOptionキーワードで始まるステートメントを書き込むほかに、プロジェクトのプロパティによって指定できる。より正確には、コンパイル・オプションで指定できるため、コマンドラインからコンパイルするプログラマーでも指定可能だ。ここでは、VS.NETのIDEを使うことを前提に話を進める。
整数のオーバーフロー・チェックを除く3種類のオプションの設定は、プロジェクトのプロパティの中で、[共通プロパティ]内の[ビルド]のページに存在する(図13-4)。
|
●図13-4 3種類のオプションの設定を行うプロジェクトのプロパティ |
[コンパイラの既定値]の下の[Option Explicit][Option Strict][Option Compare]の3つの項目がそれに当たる。プロジェクトを新規作成後に見ると、Option ExplicitがOnになっていることが分かるだろう。この項目をOffに切り替えてからプログラムを作成すれば、VB 6と同様にローカル変数を宣言しないプログラミングが可能になる。
Option ExplicitがOffの状態では、以下のプログラムはエラーにならない。
1: Public Class Form1
2: Inherits System.Windows.Forms.Form
3:
4: …Windows フォーム デザイナで生成されたコード…
5:
6: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
7: a = "1"
8: b = 2
9: c = a + b
10: Trace.WriteLine(c)
11: End Sub
12: End Class
|
|
リスト13-5 [Option Explicit]がOffだとコンパイル・エラーにならない
|
これはビルドして実行することができ、以下のような値を出力する。
|
リスト13-6 リスト13-5の実行結果
|
この状態で、ソース・コードの先頭にOption Explicit Onと書き込むと、プロジェクトのプロパティのOption Explicit設定がOffでも、そのソース・コード内では機能が有効になる。そのため、上記のプログラムはビルドするとエラーになる。この動作は、あとで述べるOption Strict、Option Compareでも共通である。つまり、プロジェクトのプロパティによる指定よりも、ソース・コードに書き込まれた指定の方が優先順位が高い。ソース・コードの記述で、プロパティ設定を打ち消せるわけである。
さて、例外となった整数のオーバーフロー・チェックだが、これはプロジェクトのプロパティの中の、[構成プロパティ]内の[最適化]の中にある(図13-7)。
|
●図13-7 整数のオーバーフロー・チェックを設定するプロジェクトのプロパティ(Visual Studio.NET 2002でのもの。2003では項目が増えているが、オプション機能関係は同じ) |
[整数オーバーフローのチェックを解除]というチェック・ボックスの指定がそれである。すでに述べたとおり、この機能には対応するOption文が存在しない。そのほかにもう1点相違がある。Option Explicit、Option Strict、Option Compareの設定は、[構成]を選択できないページ上にある。つまり、DebugビルドとReleaseビルドで設定を変えることはできない。しかし、整数のオーバーフロー・チェックは[構成]を選択できるページ上にある。そのため、Debugビルドではオーバーフロー・チェックを行い、Releaseビルドではオーバーフロー・チェックを省略するという設定もできる。オーバーフロー・チェックを省略すると、正しくない計算値のままプログラムが進行する恐れがあるが、逆に実行速度がやや向上する可能性もあるので、Debugビルドで動作を検証し、正しいと確信を持てたらReleaseビルドで高速実行する、という選択も可能である。
それぞれの項目がどのような機能を発揮するかは、本章のほかの項目で解説を行っているので、ここでは設定方法だけを確認していただきたい。
プロジェクトのプロパティでの指定は、プロジェクト全体に有効である。例えば、以下のようなソース・コードを持つ2つのフォームを含むプロジェクトがあったとする。
1: Public Class Form1
2: Inherits System.Windows.Forms.Form
3:
4: …Windows フォーム デザイナで生成されたコード…
5:
6: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
7: a = 1
8: Trace.WriteLine(a)
9: End Sub
10: End Class
|
|
リスト13-8 宣言されていないローカル変数を含む第1のフォーム
|
1: Public Class Form2
2: Inherits System.Windows.Forms.Form
3:
4: …Windows フォーム デザイナで生成されたコード…
5:
6: Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
7: b = 1
8: Trace.WriteLine(b)
9: End Sub
10: End Class
|
|
リスト13-9 宣言されていないローカル変数を含む第2のフォーム
|
この2つのソース・コードには、どちらも、宣言されていないローカル変数が含まれている。これをビルド可能にするためには、プロジェクトのプロパティを設定する方法だと、1回だけプロパティ中のOption ExplicitをOffに切り替えるだけでよい。
しかし、Option Explicit文をソース・コードに挿入する方法を使う場合は、1回では済まない。以下のように、1つ目のフォームのソース・コードにのみ“Option Explicit Off”を挿入してみよう。
1: Option Explicit Off
2:
3: Public Class Form1
4: Inherits System.Windows.Forms.Form
5:
6: …Windows フォーム デザイナで生成されたコード…
7:
8: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
9: a = 1
10: Trace.WriteLine(a)
11: End Sub
12: End Class
|
|
リスト13-10 宣言されていないローカル変数を含み、 Option Explicit Offが指定された第1のフォーム
|
1: Public Class Form2
2: Inherits System.Windows.Forms.Form
3:
4: …Windows フォーム デザイナで生成されたコード…
5:
6: Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
7: b = 1
8: Trace.WriteLine(b)
9: End Sub
10: End Class
|
|
リスト13-11 宣言されていないローカル変数を含み、 Option Explicit Offが指定されていない第2のフォーム
|
これをビルドすると、以下のようにエラーになる。
1: Q:\aWrite\@it\vbn\022\smpl\Sample003n2\Form2.vb(46) : error BC30451: 名前 'b' は宣言されていません。
2: Q:\aWrite\@it\vbn\022\smpl\Sample003n2\Form2.vb(47) : error BC30451: 名前 'b' は宣言されていません。
|
|
リスト13-12 上記2つのフォームを含むプロジェクトをビルドしたときのコンパイル・エラー
|
つまり、Option Explicit Offは挿入されたソース・コードにしか効力を発揮しておらず、複数のプログラムから構成されるプロジェクトの場合、必要なすべてのソース・コードに挿入する必要があるということである。これはデメリットのように思えるかもしれないが、メリットになる場合もある。例えば、寄せ集めのソース・コードでプロジェクトを構成する場合、前提とするオプション設定が異なるソース・コードが含まれている可能性がある。その場合にソース・コード単位でオプション文を指定して、設定を切り替えることができる。