通常の宣言ステートメントを使用して、オブジェクト変数を宣言します。 データ型には、 Object
(つまり、 オブジェクト データ型) またはオブジェクトの作成元となるより具体的なクラスを指定します。
変数を Object
として宣言することは、 System.Objectとして宣言する場合と同じです。
特定のオブジェクト クラスを使用して変数を宣言すると、そのクラスによって公開されるすべてのメソッドとプロパティ、および継承元のクラスにアクセスできます。
Objectを使用して変数を宣言すると、遅延バインディングを許可するようにOption Strict Off
しない限り、Object クラスのメンバーにのみアクセスできます。
宣言の構文
オブジェクト変数を宣言するには、次の構文を使用します。
Dim variablename As [New] { objectclass | Object }
宣言では、 Public、 Protected、 Friend、 Protected Friend
、 Private、 Shared、または Static を指定することもできます。 次の宣言例は有効です。
Private objA As Object
Static objB As System.Windows.Forms.Label
Dim objC As System.OperatingSystem
遅延バインディングと早期バインディング
コードが実行されるまで、特定のクラスが不明な場合があります。 この場合は、 Object
データ型でオブジェクト変数を宣言する必要があります。 これにより、任意の種類のオブジェクトへの一般的な参照が作成され、実行時に特定のクラスが割り当てられます。 これは 遅延バインディングと呼ばれます。 遅延バインディングには、追加の実行時間が必要です。 また、最近割り当てたクラスのメソッドとプロパティにコードを制限します。 これにより、コードが別のクラスのメンバーにアクセスしようとすると、実行時エラーが発生する可能性があります。
コンパイル時に特定のクラスがわかっている場合は、そのクラスのオブジェクト変数を宣言する必要があります。 これは 早期バインディングと呼ばれます。 事前バインディングにより、パフォーマンスが向上し、特定のクラスのすべてのメソッドとプロパティへのコード アクセスが保証されます。 前の宣言例では、変数 objA
がクラス System.Windows.Forms.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
は、Left
プロパティを含まないObject クラス自体のメンバーのみを使用できます。 一方、q
はLabel型として宣言されているため、System.Windows.Forms名前空間のLabel クラスのすべてのメソッドとプロパティを使用できます。
オブジェクト変数の柔軟性
継承階層内のオブジェクトを操作する場合は、オブジェクト変数の宣言に使用するクラスを選択できます。 この選択を行うには、オブジェクト割り当ての柔軟性とクラスのメンバーへのアクセスのバランスを取る必要があります。 たとえば、 System.Windows.Forms.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
などの特定のフォームに対して定義されている追加のメソッドやプロパティを使用することはできません。
基底クラスのすべてのメンバーは派生クラスで使用できますが、派生クラスの追加メンバーは基底クラスでは使用できません。
こちらも参照ください
.NET