Dichiarazione di variabili oggetto (Visual Basic)

Usare un'istruzione di dichiarazione normale per dichiarare una variabile oggetto. Per il tipo di dati, è necessario specificare Object, ovvero il tipo di dati Object, o una classe più specifica da cui creare l'oggetto.

Dichiarare una variabile come Object è un'operazione identica al dichiararla come System.Object.

Quando si dichiara una variabile con una classe oggetto specifica, è possibile accedere a tutti i metodi e le proprietà esposti da tale classe e alle classi da cui eredita. Se si dichiara la variabile con Object, può accedere solo ai membri della classe Object, a meno che non si usi Option Strict Off per consentire il binding tardivo.

Sintassi di dichiarazione

Usare la sintassi seguente per dichiarare una variabile oggetto:

Dim variablename As [New] { objectclass | Object }  

È anche possibile specificare Pubblico, Protetto, Amico, Protected Friend, Privato, Condiviso o Statico nella dichiarazione. Le dichiarazioni di esempio seguenti sono valide:

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

Binding tardivo e binding anticipato

A volte la classe specifica è sconosciuta fino all'esecuzione del codice. In questo caso, è necessario dichiarare la variabile oggetto con il tipo di dati Object. In questo modo viene creato un riferimento generale a qualsiasi tipo di oggetto e la classe specifica viene assegnata in fase di esecuzione. Questa operazione è definita binding tardivo. Il binding tardivo richiede tempi di esecuzione aggiuntivi. Limita inoltre il codice ai metodi e alle proprietà della classe assegnata più di recente. Ciò può causare errori di runtime se il codice tenta di accedere ai membri di una classe diversa.

Quando si conosce la classe specifica in fase di compilazione, è necessario dichiarare la variabile oggetto come appartenente a tale classe. Questa operazione è definita associazione anticipata. L'associazione anticipata migliora le prestazioni e garantisce al codice l'accesso a tutti i metodi e le proprietà della classe specifica. Nelle dichiarazioni di esempio precedenti, se la variabile objA usa solo oggetti della classe System.Windows.Forms.Label, è necessario specificare As System.Windows.Forms.Label nella relativa dichiarazione.

Vantaggi offerti dall'associazione anticipata

La dichiarazione di una variabile oggetto come classe specifica offre diversi vantaggi:

  • Controllo automatico dei tipi

  • Accesso garantito a tutti i membri della classe specifica

  • Supporto di Microsoft IntelliSense nell'editor di codice

  • Miglioramento della leggibilità del codice

  • Minor numero di errori nel codice

  • Errori rilevati in fase di compilazione anziché in fase di esecuzione

  • Esecuzione di codice più rapida

Accesso ai membri della variabile oggetto

Quando Option Strict viene trasformato in On, una variabile oggetto può accedere solo ai metodi e alle proprietà della classe con cui viene dichiarata. Ciò è illustrato nell'esempio seguente.

' 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  

In questo esempio p può usare solo i membri della classe Object stessa, che non includono la proprietà Left . D'altra parte, q è stata dichiarata con il tipo Label, perciò può usare tutti i metodi e le proprietà della classe Label nello spazio dei nomi System.Windows.Forms .

Flessibilità delle variabili oggetto

Quando si usano oggetti in una gerarchia di ereditarietà, è possibile scegliere la classe da usare per dichiarare le variabili oggetto. In questa scelta, è necessario bilanciare la flessibilità dell'assegnazione di oggetti rispetto all'accesso ai membri di una classe. Si consideri ad esempio la gerarchia di ereditarietà che porta alla classe System.Windows.Forms.Form:

Object

  MarshalByRefObject

    Component

      Control

        ScrollableControl

          ContainerControl

            Form

Si supponga che l'applicazione definisca una classe di modulo denominata specialForm, che eredita dalla classe Form. È possibile dichiarare una variabile oggetto che fa riferimento in modo specifico a specialForm, come illustrato nell'esempio seguente.

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

La dichiarazione nell'esempio precedente limita la variabile nextForm agli oggetti della classe specialForm, ma rende anche tutti i metodi e le proprietà di specialForm disponibili a nextForm, nonché tutti i membri di tutte le classi da cui specialForm eredita.

È possibile rendere una variabile oggetto più generale dichiarandola come di tipo Form, come illustrato nell'esempio seguente.

Dim anyForm As System.Windows.Forms.Form  

La dichiarazione nell'esempio precedente consente di assegnare qualsiasi modulo nell'applicazione a anyForm. Tuttavia, anche se anyForm può accedere a tutti i membri della classe Form, non può usare alcuno dei metodi o delle proprietà aggiuntivi definiti per moduli specifici, ad esempio specialForm.

Tutti i membri di una classe base sono disponibili per le classi derivate, ma i membri aggiuntivi di una classe derivata non sono disponibili per la classe base.

Vedi anche