オブジェクト変数の宣言 (Visual Basic)

オブジェクト変数を宣言する場合は、通常の宣言ステートメントを使用します。 データ型については、Object (つまり、オブジェクト型 (Object)) か、オブジェクトの作成元となる、より具体的なクラスのいずれかを指定します。

変数を Object として宣言することは、Object として宣言するのと同じことです。

特定のオブジェクト クラスを使って宣言した変数は、そのクラスおよびそのクラスが継承している各クラスによって公開されている、すべてのメソッドとプロパティにアクセスできます。 Object を指定して変数を宣言した場合、Option Strict Off を指定して遅延バインディングを有効にしていない限り、Object クラスのメンバーにのみアクセスできます。

宣言の構文

オブジェクト変数を宣言するには、次の構文を使用します。

Dim variablename As [New] { objectclass | Object }

また、宣言には Public (Visual Basic)Protected (Visual Basic)Friend (Visual Basic)、Protected Friend、Private (Visual Basic)Shared (Visual Basic)、または Static (Visual Basic) も指定できます。 たとえば、次の例のような宣言も有効です。

Private objA As Object
Static objB As System.Windows.Forms.Label
Dim objC As System.OperatingSystem

遅延バインディングと事前バインディング

場合によっては、コードを実行するまで具体的なクラスがわからないことがあります。 このような場合は、オブジェクト型 (Object) を使ってオブジェクト変数を宣言する必要があります。 これによって任意の型のオブジェクトに対応する汎用の参照が作成され、実行時に具体的なクラスが割り当てられます。 これは、遅延バインディングと呼ばれます。 遅延バインディングを行う場合、実行に必要な時間が長くなります。 また、遅延バインディングでは、直近に代入したクラスのメソッドおよびプロパティにしかコードからアクセスできません。 そのため、別のクラスのメンバーにアクセスしようとするコードがあると、実行時エラーが発生する可能性があります。

コンパイル時に具体的なクラスがわかっている場合は、そのクラスを指定してオブジェクト変数を宣言します。 これは、事前バインディングと呼ばれます。 事前バインディングでは、パフォーマンスが向上し、コードから特定のクラスのすべてのメソッドおよびプロパティに確実にアクセスできます。 上の例の宣言では、変数 objA がクラス Label のオブジェクトだけを使用する場合は、宣言で As System.Windows.Forms.Label を指定する必要があります。

事前バインディングの利点

オブジェクト変数を特定のクラスとして宣言することには、次のようにいくつかの利点があります。

  • 自動的な型チェック

  • 特定のクラスのすべてのメンバーに対するアクセスの保証

  • コード エディターにおける Microsoft IntelliSense のサポート

  • コードの読みやすさの向上

  • コードのエラーの減少

  • 実行時ではなくコンパイル時のエラー検出

  • コードの実行の高速化

オブジェクト変数のメンバーへのアクセス

Option Strict が On になっている場合、オブジェクト変数がアクセスできるのは、その変数の宣言時に指定したクラスのメソッドとプロパティだけです。 次に例を示します。

' Option statements must precede all other source file lines.
Option Strict On
' Imports statement must precede all declarations in the source file.
Imports System.Windows.Forms
Public Sub accessMembers()
    Dim p As Object
    Dim q As System.Windows.Forms.Label
    p = New System.Windows.Forms.Label
    q = New System.Windows.Forms.Label
    Dim j, k As Integer
    ' The following statement generates a compiler ERROR.
    j = p.Left
    ' The following statement retrieves the left edge of the label in pixels.
    k = q.Left
End Sub

この例の場合、p で使用できるのは Object クラス自身のメンバーだけです。Left プロパティは含まれません。 一方、q は、Label 型として宣言されているので、System.Windows.Forms 名前空間の Label クラスのすべてのメソッドとプロパティを使用できます。

オブジェクト変数の柔軟性

継承階層のオブジェクトを使用する場合に、どのクラスを使ってオブジェクト変数を宣言するかを選択できます。 クラスを選択するときに、オブジェクトを代入する場合の柔軟性とクラスのメンバーへのアクセスとのバランスを考慮する必要があります。 たとえば、Form クラスに至る継承階層は次のようになります。

Object

    Component

      Control

        ScrollableControl

          ContainerControl

            Form

たとえば、Form クラスを継承する specialForm というフォーム クラスをアプリケーションで定義するとします。 次の例のように宣言すると、specialForm だけを参照するオブジェクト変数を宣言できます。

Public Class specialForm
    Inherits System.Windows.Forms.Form
    ' Insert code defining methods and properties of specialForm.
End Class
Dim nextForm As New specialForm

上の例の宣言では、変数 nextForm を specialForm クラスのオブジェクトに制限していますが、specialForm のすべてのメソッドとプロパティに加え、specialForm が継承しているすべてのクラスのすべてのメンバーも nextForm から使用できます。

次の例に示すように、オブジェクト変数を Form 型として宣言すると、汎用性が高くなります。

Dim anyForm As System.Windows.Forms.Form

上の例の宣言では、アプリケーション内の任意のフォームを anyForm に代入できます。 ただし、anyForm は Form クラスのすべてのメンバーにアクセスできますが、specialForm など特定のフォーム用に定義された追加のメソッドやプロパティは使用できません。

基本クラスのメンバーはすべて派生クラスで使用できますが、派生クラスで追加されたメンバーを基本クラスで使用することはできません。

参照

処理手順

方法 : Visual Basic でオブジェクト変数を宣言し、オブジェクト変数にオブジェクトを代入する

方法: オブジェクトのメンバーにアクセスする (Visual Basic)

関連項目

New 演算子 (Visual Basic)

Option Strict ステートメント

概念

Visual Basic におけるオブジェクト変数

オブジェクト変数への代入 (Visual Basic)

オブジェクト変数の値 (Visual Basic)

ローカル型の推論 (Visual Basic)