連載

改訂版 プロフェッショナルVB.NETプログラミング

Chapter 13 オプション機能

株式会社ピーデー 川俣 晶
2004/08/19
Page1 Page2 Page3 Page4

 本記事は、(株)技術評論社が発行する書籍『VB6プログラマーのための入門 Visual Basic .NET 独習講座』の一部分を許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。

 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には存在しない。

Visual Basic .NET言語仕様

http://www.microsoft.com/japan/msdn/library/ja/vbls7/html/vbSpecStart.asp
 
プロジェクトのプロパティによるオプション機能の設定

 オプション機能の指定は、ソース・コードに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だとコンパイル・エラーにならない

 これはビルドして実行することができ、以下のような値を出力する。

1: 3
リスト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は挿入されたソース・コードにしか効力を発揮しておらず、複数のプログラムから構成されるプロジェクトの場合、必要なすべてのソース・コードに挿入する必要があるということである。これはデメリットのように思えるかもしれないが、メリットになる場合もある。例えば、寄せ集めのソース・コードでプロジェクトを構成する場合、前提とするオプション設定が異なるソース・コードが含まれている可能性がある。その場合にソース・コード単位でオプション文を指定して、設定を切り替えることができる。


 INDEX
  [連載] 改訂版 プロフェッショナルVB.NETプログラミング
  Chapter 13 オプション機能
  1.オプション機能による動作の変化/プロジェクトのプロパティによるオプション機能の設定/オプション機能の適用範囲
    2.Option Explicit/Option Strict(明示的なキャスト演算子を使用しない縮小変換)
    3.Option Strict(遅延バインディング/Object型での=、<>、TypeOf〜Is〜、およびIs以外の演算/宣言でのAs句の省略)
    4.Option Compare/整数のオーバーフロー・チェック/これらのオプションをどう選択するか
 
「改訂版 プロフェッショナルVB.NETプログラミング 」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH