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

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

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

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

宣言の構文

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

Dim variablename As [New] { objectclass | Object }  

宣言で PublicProtectedFriendProtected FriendPrivateSharedStatic のいずれかを指定することもできます。 次の宣言の例は有効です。

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 StrictOn になっている場合に、オブジェクト変数がアクセスできるのは、それを宣言するときに指定したクラスのメソッドとプロパティだけです。 次に例を示します。

' 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型として宣言されているため、 Label 名前空間の System.Windows.Forms クラスのすべてのメソッドとプロパティを使用できます。

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

継承階層内のオブジェクトを操作する場合は、オブジェクト変数の宣言に使用するクラスを選択できます。 この選択を行うには、オブジェクトの割り当ての柔軟性と、クラスのメンバーへのアクセスとのバランスを取る必要があります。 たとえば、System.Windows.Forms.Form クラスにつながる継承階層を考えてみます。

Object

  MarshalByRefObject

    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  

上記の例の宣言では、変数 nextFormspecialForm クラスのオブジェクトに限定していますが、specialForm のすべてのメソッドとプロパティが、nextForm と、specialForm の継承元のすべてのクラスのすべてのメンバーで使用できるようになります。

次の例に示すように、オブジェクト変数は、Form 型になるように宣言することで、より一般的なものにすることができます。

Dim anyForm As System.Windows.Forms.Form  

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

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

関連項目