Declaración de variables de objeto (Visual Basic)

Se usa una instrucción de declaración normal para declarar una variable de objeto. Para el tipo de datos, se especifica Object (es decir, el tipo de datos de objeto) o una clase más específica a partir de la cual se va a crear el objeto.

Declarar una variable como Object es lo mismo que declararla como System.Object.

Al declarar una variable con una clase de objeto específica, se puede tener acceso a todos los métodos y propiedades expuestos por esa clase y las clases de las que hereda. Si declara la variable con Object, solo se puede acceder a los miembros de la clase Object, a menos que cambie Option Strict Off para permitir el enlace en tiempo de ejecución.

Sintaxis de la declaración

Use la sintaxis siguiente para declarar una variable de objeto:

Dim variablename As [New] { objectclass | Object }  

También puede especificar Public, Protected, Friend, Protected Friend, Private, Shared o Static en la declaración. Las declaraciones de ejemplo siguientes son válidas:

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

Enlace en tiempo de ejecución y enlace anticipado

A veces, se desconoce la clase específica hasta que se ejecuta el código. En este caso, debe declarar la variable de objeto con el tipo de datos Object. Esta operación crea una referencia general a cualquier tipo de objeto y la clase específica se asigna en tiempo de ejecución. A esto se le conoce como enlace en tiempo de ejecución. El enlace en tiempo de ejecución requiere tiempo de ejecución adicional. También limita el código a los métodos y propiedades de la clase que ha asignado más recientemente. Esto puede provocar errores en tiempo de ejecución si el código intenta acceder a los miembros de una clase diferente.

Cuando conozca la clase específica en tiempo de compilación, debe declarar la variable de objeto como de esa clase. Esto se denomina enlace anticipado. El enlace anticipado mejora el rendimiento y garantiza el acceso del código a todos los métodos y propiedades de la clase específica. En las declaraciones de ejemplo anteriores, si la variable objA usa solo objetos de la clase System.Windows.Forms.Label, debe especificar As System.Windows.Forms.Label en su declaración.

Ventajas del enlace anticipado

Declarar una variable de objeto como clase específica ofrece varias ventajas:

  • Comprobación automática de tipos

  • Acceso garantizado a todos los miembros de la clase específica

  • Compatibilidad con Microsoft IntelliSense en el Editor de código

  • Legibilidad mejorada del código

  • Menos errores en el código

  • Errores detectados en tiempo de compilación en lugar de tiempo de ejecución

  • Ejecución de código más rápida

Acceso a miembros de variable de objeto

Si Option Strict se activa (On), una variable de objeto solo puede acceder a los métodos y propiedades de la clase con la que se declara. Esto se ilustra en el siguiente ejemplo:

' 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  

En este ejemplo, p puede usar solo los miembros de la propia clase Object , que no incluyen la propiedad Left . Por otro lado, q se ha declarado con el tipo Label, así que puede usar todos los métodos y propiedades de la clase Label en el espacio de nombres System.Windows.Forms .

Flexibilidad de variables de objeto

Al trabajar con objetos en una jerarquía de herencia, tiene la opción de elegir qué clase usar para declarar las variables de objeto. Para elegir esta opción, debe equilibrar la flexibilidad de la asignación de objetos con el acceso a los miembros de una clase. Por ejemplo, considere la jerarquía de herencia que lleva a la clase System.Windows.Forms.Form:

Object

  MarshalByRefObject

    Component

      Control

        ScrollableControl

          ContainerControl

            Form

Supongamos que la aplicación define una clase de formulario denominada specialForm, que hereda de la clase Form. Puede declarar una variable de objeto que haga referencia específicamente a specialForm, como se muestra en el ejemplo siguiente.

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

La declaración del ejemplo anterior limita la variable nextForm a objetos de clase specialForm, pero también hace que todos los métodos y propiedades de specialForm estén disponibles para nextForm, así como todos los miembros de todas las clases de las que hereda specialForm.

Puede hacer que una variable de objeto sea más general declarando que es de tipo Form, como se muestra en el ejemplo siguiente.

Dim anyForm As System.Windows.Forms.Form  

La declaración del ejemplo anterior le permite asignar cualquier formulario de la aplicación a anyForm. Sin embargo, aunque anyForm puede tener acceso a todos los miembros de la clase Form, no puede usar ninguno de los métodos o propiedades adicionales definidos para formularios específicos, como specialForm.

Todos los miembros de una clase base están disponibles para las clases derivadas, pero los miembros adicionales de una clase derivada no están disponibles para la clase base.

Consulte también