Solucionar problemas de variables en Visual Basic

Actualización: noviembre 2007

Esta página muestra algunos problemas comunes que pueden aparecer al trabajar con variables en Visual Basic.

No se puede obtener acceso a los miembros de un objeto

Si el código intenta tener acceso a una propiedad o un método en un objeto, hay dos posibles resultados de error:

  • El compilador puede generar un mensaje de error si declara la variable de objeto con un tipo específico y, a continuación, hace referencia a un miembro no definido por dicho tipo.

  • Se produce una excepción MemberAccessException en tiempo de ejecución cuando el objeto asignado a una variable de objeto no expone el miembro al que el código intenta obtener acceso. En el caso de una variable de Object (Tipo de datos), también puede obtener esta excepción si el miembro no es de tipo Public. Esto se debe a que el enlace en tiempo de ejecución sólo permite el acceso a miembros de tipo Public.

Si Option Strict (Instrucción) establece la comprobación de tipos como On, una variable de objeto sólo puede tener acceso a los métodos y propiedades de la clase con la que se ha declarado. Esto se ilustra en el siguiente ejemplo:

Option Strict On
Dim p As Object = New System.Windows.Forms.Label
Dim q As System.Windows.Forms.Label = 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

En este ejemplo, p puede utilizar sólo 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 utilizar todos los métodos y propiedades de la clase Label en el espacio de nombres System.Windows.Forms.

Enfoque correcto

Para obtener acceso a todos los miembros de un objeto de una clase determinada, declare la variable de objeto con el tipo de dicha clase siempre que sea posible. Si no puede realizarlo de esta manera, por ejemplo si no conoce el tipo del objeto en tiempo de compilación, debe establecer Option Strict como Off y declarar la variable como Object (Tipo de datos). Esto permite que se asignen a la variable los objetos de cualquier tipo; debe llevar a cabo los pasos necesarios para asegurarse de que el objeto asignado es de un tipo válido. Para esto, puede utilizar TypeOf (Operador, Visual Basic).

Otros componentes no pueden tener acceso a la variable

En los nombres de Visual Basicno se distingue entre mayúsculas y minúsculas. Si dos nombres sólo se distinguen por el uso de mayúsculas y minúsculas, el compilador los interpreta como el mismo nombre. Por ejemplo, ABC y abc hacen referencia al mismo elemento declarado.

No obstante, Common Language Runtime (CLR) utiliza enlaces que sí distinguen entre mayúsculas y minúsculas. Por lo tanto, cuando genere un ensamblado o una DLL que pueda estar disponible para otros ensamblados, sus nombres sí se distinguirán por sus mayúsculas o minúsculas. Por ejemplo, si define una clase que tiene un elemento denominado ABC, y otros ensamblados utilizan la clase por medio de Common Language Runtime, deberán hacer referencia al elemento como ABC. Si, posteriormente, vuelve a compilar la clase y cambia el nombre del elemento a abc, los otros ensamblados que utilicen la clase ya no tendrán acceso a este elemento. Por lo tanto, cuando se lance una versión actualizada de un ensamblado, no se deben cambiar las mayúsculas o minúsculas de los elementos públicos.

Para obtener más información, vea Common Language Runtime.

Enfoque correcto

Para permitir a otros componentes tener acceso a las variables, trate sus nombres como si distinguieran entre mayúsculas y minúsculas. Cuando pruebe la clase o el módulo, asegúrese de que los demás ensamblados se enlazan con las variables esperadas. Después de publicar un componente, no realice ninguna modificación en los nombres de variable existentes, incluido el cambio entre mayúsculas y minúsculas.

Uso de la variable equivocada

Cuando tiene más de una variable con el mismo nombre, el compilador de Visual Basic intenta resolver cada referencia como dicho nombre. Si las variables tienen ámbito diferente, el compilador resuelve una referencia como la declaración con el ámbito más limitado. Si tienen el mismo ámbito, se produce un error en la resolución y el compilador señala un error. Para obtener más información, vea Resolver una referencia cuando muchas variables tienen el mismo nombre.

Enfoque correcto

Evite utilizar variables con el mismo nombre pero ámbito diferente. Si utiliza otros ensamblados o proyectos, evite en la medida de lo posible utilizar nombres definidos en dichos componentes externos. Si tiene más de una variable con el mismo nombre, asegúrese de calificar todas las referencias a ella. Para obtener más información, vea Cómo: Distinguir entre dos elementos con el mismo nombre.

Vea también

Tareas

Cómo: Obtener acceso a los miembros de un objeto

Cómo: Determinar el tipo al que hace referencia una variable de objeto

Conceptos

Variables en Visual Basic

Declaración de variable en Visual Basic

Variables de objeto en Visual Basic

Declaración de variables de objeto

Valores de las variables de objeto

Resolver una referencia cuando muchas variables tienen el mismo nombre

Nombres de elementos declarados