暗黙の宣言と明示的宣言

更新 : 2007 年 11 月

既定では、Visual Basic コンパイラは明示的宣言を行います。この場合は、すべての変数を使用前に宣言する必要があります。この要件を取り除くと、暗黙の宣言を許可できます。

Visual Basic には、明示的宣言を制御するスイッチが用意されています。既定では、このスイッチは On に設定され、コンパイラは明示的な宣言を要求します。このスイッチを Off にすると、変数を宣言しなくても使用できます。

明示的宣言スイッチ。 明示的宣言スイッチの On と Off の設定は、次のいずれかの方法で行います。

  • 統合開発環境 (IDE: Integrated Development Environment) で、適切なプロジェクト プロパティを設定します。[プロジェクト] メニューの [<プロジェクト名> プロパティ] をクリックし、[コンパイル] タブをクリックします。[Option Explicit]、[Option Strict]、および [Option Compare] の既定値を設定できます。

  • /optionexplicit コマンド ライン コンパイラ オプションを指定します。

  • コードの先頭に Option Explicit ステートメント (Visual Basic) を含めます。

OptionExplicit ステートメントを使用すると、そのステートメントが指定されたソース コード ファイルについては、プロジェクト プロパティやコンパイラ オプションの設定よりも優先されます。

**パフォーマンス上の利点。**OptionExplicit を On にすると、実行時ではなくコンパイル時に型の推定を行うよう強制できる利点があります。これにより、パフォーマンスが向上します。

暗黙の宣言

OptionExplicit を Off にすると、コード内で変数を単に使用することによって変数を暗黙的に宣言できます。暗黙的に宣言したすべての変数に対して、コンパイラは オブジェクト型 (Object) を割り当てます。ただし、すべての変数を明示的に特定のデータ型として宣言した方がアプリケーションは効率的に動作します。明示的な宣言によって、名前の競合によるエラーやスペル ミスの発生は減少します。また、整数型 (Integer) を短整数型 (Short) に代入するなどのランタイム エラーをコンパイラで検出できます。

発生する可能性のあるエラー

意図しない新規の変数

ローカル変数を宣言しないプロシージャを作成できます。次に例を示します。

Function safeSqrt(num)
' Make sure num is positive for square root.
    tempVal = Math.Abs(num)
    Return Math.Sqrt(tempVal)
End Function

Visual Basic では、tempVal がローカル変数として自動的に作成され、明示的に宣言した場合と同様に使用できます。これは便利ですが、変数名のスペルを間違えると、コード内で軽度のエラーが発生する場合があります。上の例で、次のようなプロシージャを記述したとします。

Function safeSqrt(num)
' Make sure num is positive for square root.
    tempVal = Math.Abs(num)
    Return Math.Sqrt(temVal)
End Function

一見すると、この 2 つのコードは同じです。しかし、Sqrt の引数の変数 tempVal にスペル ミスがあるため、コンパイラで temVal という別のローカル変数が作成されます。この変数には値が代入されないので、この関数は常に 0 を返します。

既存の要素への意図しない参照

Visual Basic で新しい名前が検出された場合、それが新規変数の暗黙的な宣言なのか、既存の変数名のスペルが間違っているのかを判断できません。その結果、この名前の変数が新規作成されます。また、同じ名前で変数または別のプログラミング要素が既に定義されている場合、コードでは定義済みの要素を無意識に使用することになります。

明示的宣言を使用すると、名前のスペル ミスによる問題は回避できます。

明示的宣言

上の例で、safeSqrt 関数を含むモジュールについて明示的宣言が有効になっていたとすると、Visual Basic では tempVal と temVal を宣言されていない変数と認識し、両方についてエラーを生成します。そのため、tempVal を明示的に宣言するよう修正する必要があります。次に例を示します。

Function safeSqrt(ByVal num As Double) As Double
' Make sure num is positive for square root.
    Dim tempVal As Double = Math.Abs(num)
    Return Math.Sqrt(temVal)
End Function

この変更後のコードでは、Visual Basic ではスペル ミスがある temVal についてエラー メッセージが表示されるため、問題をすぐに特定できます。明示的宣言を使用すると、このようなエラーを見つけるのに役立つため、すべてのコードで使用することをお勧めします。

xe53dz5w.alert_note(ja-jp,VS.90).gifメモ :

OptionExplicit ステートメントはファイル単位で機能します。このステートメントは、変数の明示的宣言の実行を制御するすべてのソース コード ファイルの先頭に指定する必要があります。

参照

処理手順

方法 : プロジェクト プロパティおよび構成設定を変更する

概念

Visual Basic での型宣言を省略したプログラミング

Visual Basic における型チェック

汎用データ型としてのオブジェクト型 (Object)

データ型の有効な使用方法

Visual Basic における変数

Visual Basic の名前付け規則

参照

データ型の概要 (Visual Basic)

データ型変換関数