次の方法で共有


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

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

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

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

宣言の構文

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

Dim variablename As [New] { objectclass | Object }  

宣言では、 PublicProtectedFriendProtected FriendPrivateShared、または 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 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は、Left プロパティを含まないObject クラス自体のメンバーのみを使用できます。 一方、qLabel型として宣言されているため、System.Windows.Forms名前空間のLabel クラスのすべてのメソッドとプロパティを使用できます。

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

継承階層内のオブジェクトを操作する場合は、オブジェクト変数の宣言に使用するクラスを選択できます。 この選択を行うには、オブジェクト割り当ての柔軟性とクラスのメンバーへのアクセスのバランスを取る必要があります。 たとえば、 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  

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

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

Dim anyForm As System.Windows.Forms.Form  

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

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

こちらも参照ください