連載

プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――

第26回 言語の動作を選択するオプション(前編)

(株)ピーデー
川俣 晶
2002/11/23

Page1 Page2 Page3

オプション機能

 VB 6(Visual Basic 6.0)では以下のような変数宣言のない安易なプログラムをいきなり入力して実行することができた。

 1: Private Sub Form_Load()
 2:   a = 2
 3:   b = 3
 4:   Debug.Print a * b
 5: End Sub
変数宣言せずに変数を使用するVB 6のサンプル・プログラム1

 しかし、VB.NET(Visual Basic .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
変数宣言せずに変数を使用するVB.NETのサンプル・プログラム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' は宣言されていません。
サンプル・プログラム2をコンパイルすると出力されるエラー・メッセージ

 この挙動の相違が、「Option Explicit」という機能の初期値の違いによることは、本連載の「第2回 データ型の処理」ですでに述べた。VB 6では、Option Explicitを指定しなければ、宣言しない変数はVariant型のローカル変数として自動的に宣言されたものと見なされる。逆にこれを指定すると、宣言されていない変数はすべてエラーになる。

 VB 6でも、ソース・コードの先頭に以下の1行を追加すれば、VB.NETと同じ挙動になる。あるいは、ツール・メニューのオプションで「変数宣言を強制する」をチェックしてからプロジェクトを作成することで、初期状態でこの行をソース・コードに含めることもできる。

Option Explicit

 また、VB.NETでも、ソース・コードの先頭に以下の1行を追加すれば、VB 6と同じ挙動になりコンパイルできるようになる。

Option Explicit Off

 あるいは、プロジェクトのプロパティから、コンパイラの既定値を変更することでも実現できる(詳しい手順は後で述べる)。

 ここで明らかになったことは、オプション機能の設定によって、ビルド可能なソース・コードがビルド不可能に変わる場合があるということである。これは、VB.NETのコードを扱う上で、オプション機能の設定が極めて重要な意味を持つことを示している。さらに、VB.NETでは、オプション機能の種類が増えていて、その上、指定方法もソース・コード中で記述するほかに、プロジェクトのプロパティで設定する方法もあり、複雑さの度合いが増している。そのため、オプション機能の扱いを間違えると、トラブルになりやすいといえるだろう。今回は、VB.NETのオプション機能全般について解説したい。

 なお、「Visual Basic.NET言語仕様」の「5.1コンパイル・オプション」で、「言語の意味に影響を与える 4 つのコンパイル オプションがあります」と説明されているが、この4つとは、「Option Explicit」「Option Strict」「Option Compare」そして「整数のオーバーフロー・チェック」である。このうち、整数のオーバーフロー・チェックのみ、対応する宣言文がなく、ソース・コード上で指定できない。

 VB 6では「Option Base」という文もあり、配列の添え字のデフォルトの開始値が0か1かを指定することができたが、これも第2回の「配列添え字の下限」ですでに説明したとおり、VB.NETには存在しない。

プロジェクトのプロパティによる指定とソース・コードによる指定

 オプション機能の指定は、プロジェクトのプロパティによって指定できる。より正確には、コンパイル・オプションで指定できるため、コマンドラインからコンパイルするプログラマーでも指定可能だ。ここでは、VS.NETのIDEを使うことを前提に話を進める。

 整数のオーバーフロー・チェックを除く3種類のオプションの設定は、プロジェクトのプロパティの中で、[共通プロパティ]内の[ビルド]のページに存在する。

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
[Option Explicit]がOffだとコンパイル・エラーにならないサンプル・プログラム3

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

 1: 3
サンプル・プログラム3の実行結果

 この状態で、ソース・コードの先頭にOption Explicit Onと書き込むと、プロジェクトのプロパティの[Option Explicit]設定がOffでも、そのソース・コード内では機能が有効になる。そのため、上記のプログラムはビルドするとエラーになる。この動作は、後で述べるOption Strict、Option Compareでも共通である。つまり、プロジェクトのプロパティによる指定よりも、ソース・コードに書き込まれた指定の方が優先順位が高い。ソース・コードの記述で、プロパティ設定を打ち消せるわけである。

 さて、例外となった整数のオーバーフロー・チェックだが、これはプロジェクトのプロパティの中の、[構成プロパティ]内の[最適化]の中にある。

整数のオーバーフロー・チェックを設定するプロジェクトのプロパティ

 [整数オーバーフローのチェックを解除]というチェック・ボックスの指定がそれである。すでに述べたとおり、この機能には対応するOption文が存在しない。そのほかにもう1点相違がある。Option Explicit、Option Strict、Option Compareの設定は[構成]を選択できないページ上にある。つまり、DebugビルドとReleaseビルドで設定を変えることはできない。しかし、整数のオーバーフロー・チェックは[構成]を選択できるページ上にある。そのため、Debugビルドではオーバーフロー・チェックを行い、Releaseビルドではオーバーフロー・チェックを省略するという設定もできる。オーバーフロー・チェックを省略すると、正しくない計算値のままプログラムが進行する恐れがあるが、実行速度がやや向上する可能性がある。

 それぞれの項目がどのような機能を発揮するかは、この後で詳しく説明するので、ここでは設定方法だけを確認していただきたい。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第26回 言語の動作を選択するオプション(前編)
  1.オプション機能
    2.オプション指定の適用範囲
    3.Option Strict
 
「プロフェッショナル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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間